1

我将 3 个数组指针传递给 opengl:

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 回答