我向opengl传递了3个数组指针:
glColorPointer()
glNormalPointer()
glVertexPointer()
一切都很好,但当我试图通过glEnable(GL_LIGHT0)激活光线时;
我想是正常的问题吧?我的正常值来自这个文件:
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个是正常的,我有问题:
当我平移、旋转或缩放网格时,法线会改变吗?
启用照明会导致gldrawerements崩溃的原因是什么?
3.由于我的法线来自文件,并且它已经规范化了,我必须调用glEnable(GL_NORMALIZE)吗?
最佳答案
当gldrawerElements试图访问您的内存时,您可能向glNormalPointer传递了无效参数,从而导致访问冲突。旧的固定功能逐顶点照明代码仅在启用照明时使用法线。
关于你的其他问题:
旋转网格时必须旋转法线。平移和缩放不影响法线。这是由固定函数管道(我想您正在使用)自动完成的,并且只需在编写自定义顶点着色器或在CPU上旋转网格时手动完成。仅当缩放网格时才需要glEnable(GL_NORMALIZE),否则可以放弃此函数。