タグ

ブックマーク / halo-w2.hatenadiary.org (2)

  • glScalefのバカヤローヽ(`Д´)ノ - きのこる先生 -チラシの裏

    メタセコモデルのローダーを改良中。なんだけれど妙な問題にぶつかった。どうしてもモデルのシェーディングがおかしい。異常にハイライトがきつかったり暗すぎたり。法線の計算ルーチンがバグっているのかと思い見直してみるも問題ない様子。材質やライティングの設定をあれこれ弄ってみてもだめぽ。数時間悩む。 思い立って何気なくglEnable(GL_NORMALIZE)を有効にしてみたところ一気に解決。どうやら犯人はモデルの大きさを合わせるために使っていたglScalef。こいつで拡大縮小するとおせっかいなことに法線まで拡大縮小されてしまうらしい。OpenGLでは法線は単位ベクトル長でなければならないので、シェーディングがおかしくなったようだ。 glScalefを使う場合はGL_NORMALIZE有効にするか法線の再正規化をしましょうってことで。 法線は拡大縮小されないと勝手に思い込んでいた漏れが悪いのか。

    glScalefのバカヤローヽ(`Д´)ノ - きのこる先生 -チラシの裏
    suireN
    suireN 2010/02/06
    glScalefすると、法線も拡大縮小されるので、glEnable(GL_NORMALIZE)等を行う必要がある
  • 描画の高速化2 - きのこる先生 -チラシの裏

    昨日の続き。頂点配列をOpenGLに渡すときにはglVertexPointer()、glNormalPointer()、などで頂点や法線のデータを個別の配列で渡してやる方法と、glInterleaveArrays()で指定のデータ構造の配列を渡してやる方法がある。 // 個別に配列を指定する場合 glVertexPointer(3, GL_FLOAT, 0, &vertex_array[0]); glNormalPointer(GL_FLOAT, 0, &normal_array[0] ); glTexCoordPointer(2, GL_FLOAT, 0, &texCoord_array[0]); glDrawArrays(GL_TRIANGLES, 0, num_vertices);// glInterleavedArrays()の場合 struct Vertex { float te

    描画の高速化2 - きのこる先生 -チラシの裏
    suireN
    suireN 2010/02/01
    glDrawArrays()について
  • 1