1

iOS で使用するオブジェクト ローダーの作成に取り組んでいます。OBJ ファイルから頂点、法線、および面データをロードし、このデータを配列に配置してオブジェクトを再構築しました。しかし、照明の問題に遭遇しました。下部にあるのは、プログラムのシミュレーションからのビデオです。これは、照明が次の位置にある場合です。

CGFloat position[] = { 0.0f, -1.0f, 0.0f, 0.0f };
glLightfv(GL_LIGHT0, GL_POSITION, position);

これは、各フレームの render メソッドと、セットアップ時に 1 回呼び出されるセットアップ ビュー メソッドの両方で指定されます。

さまざまなその他の照明の詳細はここにあります。これらはセットアップ中に一度呼び出されます。

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
CGFloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
CGFloat diffuseLight[] = { 1.0f, 0.0f, 0.0, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
CGFloat position[] = { 0.0f, -1.0f, 0.0f, 0.0f };
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);

問題のビデオは次の場所にあります。

http://youtu.be/dXm4wqzvO5c

ありがとう、

ポール

[編集]

詳細については、法線は次のコードによっても提供されます。現在、それらは大きな法線配列または XYZ XYZ XYZ などにあります...

// FACE SHADING
glColorPointer(4, GL_FLOAT, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);
glNormalPointer(GL_FLOAT, 3, normals);
glEnableClientState(GL_NORMAL_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3*numOfFaces); 
glDisableClientState(GL_COLOR_ARRAY);
4

1 に答える 1

1

私は今、信じられないほど愚かだと感じています...学生プログラマーであることのすべての部分だと思います。これに対する回答を残しておきますので、他の誰かがこの問題を抱えている場合は、彼らも解決できます! 間違いは単にタイプミスによるものでした:

glNormalPointer(GL_FLOAT, 3, normals);

読むべきだった

glNormalPointer(GL_FLOAT, 0, normals);

2 番目の引数は、配列に Vert Coords / Normals / Texture Coords などの他の値が含まれている場合にのみ使用される STRIDE です。私のものは単一の配列にあるため、値間のストライドは0にする必要があります。

于 2011-10-01T10:28:28.900 に答える