0

現時点では、モデルの頂点ごとに 1 つの法線を使用していますが、これは照明に関してモデルを丸く見せることに相当します。これは、モデルが鋭いエッジを持つことを意図しているため、理想的ではありません。グーグルで調べてみると、opengl-es 2.0 でサーフェス法線を使用することはできないようですが、代わりの手法は、頂点ごとに複数の頂点法線を使用して、サーフェス法線を使用しているかのように動作させることです。

これは、インデックス バッファが法線配列と頂点配列で異なる必要があることを意味します。たとえば、立方体には 8 つの頂点がありますが、各頂点にはサーフェス法線のように機能する 3 つの法線が必要になるためです (各接続面に 1 つ)。立方体、opengl-es が必要とするモデルが三角測量されている場合は、さらに必要になる可能性があります)。したがって、頂点のインデックス配列は 8 になり、法線のインデックス配列は 8x3=24 になります。

誰もこれを行う方法を知っていますか?

現時点で私のコードは次のようになります

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*sizeof(GLubyte), indices, GL_STATIC_DRAW);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);        
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, 0);

glGenBuffers(1, &_normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer);
glBufferData(GL_ARRAY_BUFFER, numNormals*sizeof(GLfloat), normals, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, 0);
4

1 に答える 1

2

頂点ごとに複数の法線を設定することはできません。また、法線と位置に異なるインデックスを設定することもできません。

これを行う唯一の方法は、位置データを複製し、各位置に異なる法線をアタッチすることです。

于 2012-07-09T17:25:21.123 に答える