什么可能导致glEnable(GL_LIGHT0)崩溃glDrawElements?

时间:2012-12-17 08:09:33

标签: c opengl

我通过以下方法将3个数组指针传递给opengl:

glColorPointer() 
glNormalPointer() 
glVertexPointer()

everthing工作正常,但当我尝试通过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. 3.因为我的法线来自文件,并且已经规范化了我是否必须调用glEnable(GL_NORMALIZE)?

1 个答案:

答案 0 :(得分:2)

当glDrawElements尝试访问您的内存时,您可能会将无效参数传递给glNormalPointer,从而导致访问冲突。旧的固定功能每顶点照明代码仅在启用照明时使用法线。

关于您的其他问题: 旋转网格时必须旋转法线。翻译和缩放不会影响法线。这是由固定功能管道(我想你正在使用)自动完成的,只需在编写自定义顶点着色器或在CPU上旋转网格时手动完成。只有在缩放网格时才需要glEnable(GL_NORMALIZE),否则您可以放弃此功能。