1

私はopenglに3つの配列ポインタを渡しました:

glColorPointer() 
glNormalPointer() 
glVertexPointer()

すべてが正常に機能しますが、glEnable(GL_LIGHT0);でライトを有効にしようとすると

glDrawElementsがクラッシュしたばかりですが、通常は何か問題があると思いますか?私の通常はこのファイルから来ています:

1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000
1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000
-1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000
1.000000 0.999999 1.000000 -0.000000 0.000000 1.000000
-1.000000 1.000000 1.000000 -0.000000 0.000000 1.000000
-1.000000 -1.000000 1.000000 -0.000000 0.000000 1.000000
1.000000 1.000000 -1.000000 1.000000 -0.000001 -0.000000
1.000000 0.999999 1.000000 1.000000 -0.000001 -0.000000
0.999999 -1.000001 1.000000 1.000000 -0.000001 -0.000000
1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000
0.999999 -1.000001 1.000000 -0.000000 -1.000000 -0.000000
-1.000000 -1.000000 1.000000 -0.000000 -1.000000 -0.000000
-1.000000 -1.000000 -1.000000 -1.000000 0.000000 -0.000000
-1.000000 -1.000000 1.000000 -1.000000 0.000000 -0.000000
-1.000000 1.000000 1.000000 -1.000000 0.000000 -0.000000
1.000000 0.999999 1.000000 0.000000 1.000000 0.000000
1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000
-1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000
-1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000
0.999999 -1.000001 1.000000 -0.000000 0.000000 1.000000
1.000000 -1.000000 -1.000000 1.000000 0.000000 0.000000
1.000000 1.000000 -1.000000 1.000000 0.000000 0.000000
0.999999 -1.000001 1.000000 1.000000 0.000000 0.000000
-1.000000 -1.000000 -1.000000 -0.000000 -1.000000 0.000000
-1.000000 1.000000 -1.000000 -1.000000 0.000000 -0.000000
-1.000000 1.000000 1.000000 0.000000 1.000000 0.000000

最初の3つは頂点の位置で、最後の3つは正常です。質問があります。

  1. メッシュを平行移動、回転、またはスケーリングすると、通常は変化しますか?

  2. ライティングを有効にすると、glDrawElementsがクラッシュする原因は何ですか?

3.法線はファイルから取得され、すでに正規化されているので、glEnable(GL_NORMALIZE)を呼び出す必要がありますか?

4

1 に答える 1

2

glDrawElementsがメモリにアクセスしようとしたときに、glNormalPointerに無効な引数を渡して、アクセス違反を引き起こした可能性があります。古い固定関数の頂点ごとのライティングコードは、ライティングが有効になっている場合にのみ法線を使用します。

その他の質問について:メッシュを回転させるときは、法線を回転させる必要があります。平行移動とスケーリングは法線に影響しません。これは、固定関数パイプライン(使用していると思います)によって自動的に実行され、カスタム頂点シェーダーを作成するとき、またはCPUでメッシュを回転するときに手動で実行する必要があります。glEnable(GL_NORMALIZE)は、メッシュをスケーリングする場合にのみ必要です。それ以外の場合は、この関数を破棄できます。

于 2012-12-17T08:27:42.903 に答える