1

我正在创建一个用于 iOS 的对象加载器,我已经设法从 OBJ 文件加载顶点、法线和面数据,然后将这些数据放入数组中以重建对象。但是我遇到了照明问题,底部是我的程序模拟的视频 - 这是在以下位置的照明:

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

这在每帧的渲染方法和设置视图方法中都指定,该方法在设置时调用一次。

这里有各种其他的照明细节,这些在设置过程中被调用一次:

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);

第二个参数是 STRIDE,仅在数组包含其他值时使用,例如 Vert Coords / Normals / Texture Coords。因为我的是单个数组,所以值之间的步幅应该是 0。

于 2011-10-01T10:28:28.900 回答