我正在创建一个用于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);
可以在此处找到该问题的视频:
谢谢,
保
[编辑]
更多信息法线也由以下代码提供,它们目前在一个大的法线数组或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);
答案 0 :(得分:1)
我现在感到非常愚蠢...我想,作为一名学生程序员的所有部分。我会给出一个答案,所以如果有其他人得到这个问题他们也可以解决它!错误只是一个错字:
glNormalPointer(GL_FLOAT, 3, normals);
应该已阅读
glNormalPointer(GL_FLOAT, 0, normals);
第二个参数是STRIDE,仅当数组包含其他值时才使用垂直坐标/法线/纹理坐标。由于我的是单个阵列,因此值之间的步幅应为0.