2011-01-02 4 views
0

私は5頂点と18のインデックスを持つピラミッドを持っています。各面に法線を追加したいので、各頂点の法線の解を見つけました。つまり、私はピラミッドを定義するためにインデックスを使うことはできません。私は、18の頂点を持つ必要があります(そして、同じポイントの同じ頂点を3倍にする必要があります)。インデックスごとの法線ですか?

頂点ベースではなくインデックスベースで法線を使用するソリューションが必要です。

いくつかのコード(ジャバスクリプト):

var vertices = [ 
    -half, -half, half, // 0 front left 
    half, -half, half, // 1 front right 
    half, -half, -half, // 2 back right 
    -half, -half, -half, // 3 back left 
     0.0, Math.sqrt((size * size) - (2 * (half * half))) - half, 0.0 // 4 top 
]; 

var vertexNormals = [ 
    // front face 
    normaleFront[0], normaleFront[1], normaleFront[2], 
    normaleFront[0], normaleFront[1], normaleFront[2], 
    normaleFront[0], normaleFront[1], normaleFront[2], 

    // back face 
    normaleBack[0], normaleBack[1], normaleBack[2], 
    normaleBack[0], normaleBack[1], normaleBack[2], 
    normaleBack[0], normaleBack[1], normaleBack[2], 

    // left face 
    normaleLeft[0], normaleLeft[1], normaleLeft[2], 
    normaleLeft[0], normaleLeft[1], normaleLeft[2], 
    normaleLeft[0], normaleLeft[1], normaleLeft[2], 

    // right face 
    normaleRight[0], normaleRight[1], normaleRight[2], 
    normaleRight[0], normaleRight[1], normaleRight[2], 
    normaleRight[0], normaleRight[1], normaleRight[2], 

    // bottom face 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
]; 

var pyramidVertexIndices = [ 
    0, 1, 4, // Front face 
    2, 3, 4, // Back face 
    3, 0, 4, // Left face 
    1, 2, 4, // Right face 
    0, 1, 2, 2, 3, 0, // Bottom face 
]; 
+0

を呼び出すことができます。何行うことができますが、インデックス配列の順と次元で頂点に満たされた二番目の配列を作成することです...行うことはできません。 ..あなたは1つの頂点を変更することができ、生成された2番目の配列のすべての場所で変更されます – WarrenFaith

答えて

1

ピラミッドの各頂点は、それが属する面に応じて、三つの異なる法線を有します。したがって、毎回別の法線で3回、各頂点を渡して、glDrawElementsを使用する必要があります。

代わりにあなただけ追加する

// Face 1 
glNormal 
glVertex 
glVertex 
glVertex

// Face 2 glNormal glVertex glVertex glVertex

// ...

+0

同じ頂点を繰り返し作成するのではなく、同じ頂点を指すためにそれらを使用するインデックスの考えはありませんか?頂点ではなく、インデックスの法線を定義する可能性が必要です。私は、頂点の数を減らすためにインデックスを使用したい... – WarrenFaith

+1

これはよくここで説明されています:http://stackoverflow.com/questions/1664402/how-can-i-specify-perface-colors-when- using-indexed-vertex-arrays-in-opengl-3-x-a頂点は頂点属性の集合であり、位置だけでなくすべての属性です。いくつかの場所からそれらを混ぜ合わせたり、マッチさせることはできません。これはGPUが内部的にどのように動作するかではありません。 –