Appleのサンプルコードに基づいて、OpenGL-ESでかなり基本的な形状を作成しています。彼らはポイントの配列を使用し、最初の配列にインデックスの配列を入れ、3つのインデックスの各セットがポリゴンを作成します。それはすべて素晴らしいです、私は私が望む形を作ることができます。シェイプを正しくシェーディングするには、各ポリゴンの各頂点の法線を計算する必要があると思います。最初は形状が立方体だったのでとても簡単でしたが、今は(少し)より高度な形状を作成して、それらの法線を自動的に作成したいと思っています。ポリゴンの2つのエッジ(ここではすべてのポリゴンは三角形です)のベクトルを取得し、そのポリゴンのすべての頂点に外積を使用すれば、十分に簡単に思えます。その後、以下のようなコードを使用して形状を描画します。
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, triangleVertices);
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, triangleColours);
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, triangleNormals);
glDrawArrays(GL_TRIANGLES, 0, 48);
glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribColor);
glDisableVertexAttribArray(GLKVertexAttribNormal);
私が理解するのに苦労しているのは、なぜこれを手動で行わなければならないのかということです。表面に垂直なベクトル以外のものが必要な場合もあると思いますが、これがこれまでで最も人気のあるユースケースであると確信しているので、もっと簡単な方法はないでしょうか。明らかな何かを見逃したことがありますか?glCalculateNormals()は素晴らしいでしょう。
//これがGLKVector3[]の回答パスで、法線、頂点(3つはそれぞれポリゴンにグループ化されています)、そして頂点の数で埋めたいと考えています。
- (void) calculateSurfaceNormals: (GLKVector3 *) normals forVertices: (GLKVector3 *)incomingVertices count:(int) numOfVertices
{
for(int i = 0; i < numOfVertices; i+=3)
{
GLKVector3 vector1 = GLKVector3Subtract(incomingVertices[i+1],incomingVertices[i]);
GLKVector3 vector2 = GLKVector3Subtract(incomingVertices[i+2],incomingVertices[i]);
GLKVector3 normal = GLKVector3Normalize(GLKVector3CrossProduct(vector1, vector2));
normals[i] = normal;
normals[i+1] = normal;
normals[i+2] = normal;
}
}