不寻常的灯光效果 - 随机多边形彩色

发布于 2024-12-07 04:09:10 字数 1227 浏览 1 评论 0原文

我正在努力创建一个与 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

谢谢,

Paul

[编辑]

获取更多信息法线也由以下代码提供,它们当前位于大型法线数组或 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);

I am working on creating an object loader for use with iOS, I have managed to load the vertices, normals and face data from and OBJ file, and then place this data into arrays for reconstructing the object. But I have come across an issue with the lighting, at the bottom is a video from the simulation of my program - this is with the lighting in the following position:

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

This is specified in both the render method each frame and the setup view method which is called once at setup.

Various other lighting details are here, these are called once during setup:

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

The video of the issue can be found here:

http://youtu.be/dXm4wqzvO5c

Thanks,

Paul

[EDIT]

for further info normals are also supplied by the following code, they are currently in a large normals array or XYZ XYZ XYZ etc...

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼眸印温柔 2024-12-14 04:09:10

我现在觉得自己非常愚蠢……我想这都是作为一名学生程序员的一部分。我会留下一个答案,这样如果其他人遇到这个问题,他们也可以解决它!这个错误只是由于拼写错误:

glNormalPointer(GL_FLOAT, 3, normals);

应该读

glNormalPointer(GL_FLOAT, 0, normals);

第二个参数是 STRIDE,仅当数组包含其他值(例如垂直坐标/法线/纹理坐标)时才使用它。由于我的在单个数组中,值之间的步长应该为 0。

I now feel incredibly stupid... All part of being a student programmer I guess. I will leave an answer to this so if anyone else gets this problem they can solve it too! The mistake was simply down to a typo:

glNormalPointer(GL_FLOAT, 3, normals);

Should have read

glNormalPointer(GL_FLOAT, 0, normals);

The second argument being the STRIDE which is only used if the array contains other values e.g. Vert Coords / Normals / Texture Coords. As mine are in single arrays the stride between the values should be 0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文