在球体内部照明?

时间:2010-08-11 12:01:44

标签: opengl geometry glut lighting pixel-shading

我有这个问题:我需要制作一个看起来像真实天空的场景。我的第一个想法是制作一个立方体并将其纹理化。这不是那么好看。我想出了使用球体的想法。但我无法从内部照亮它。我把相机放在原点上观看(0,0,-100)。环境和镜面光源也在原点。看不到任何东西点燃!制作天空的方法是什么?如何点亮球体的内部?

5 个答案:

答案 0 :(得分:3)

尝试更改剔除模式,因为你在球体内部。

我是XNA的人,但看起来这将是OpenGL equivalent。如果您按照说法开启了环境照明,我相信您应该能够看到一些不管法线的东西。

答案 1 :(得分:2)

尝试flipping the normals of the sphere(更多搜索结果here)。通常,渲染引擎使用算法来确定不可能看到的内容,因此不应该呈现;一种这样的技术是backface culling.我猜测球体是以典型的方式创建的,法线从球体中突出,远离中心;你需要面向相反的法线。

答案 2 :(得分:1)

如果它从外面照亮,但从内部变暗,则可能是球体的法线指向错误的方向。

假设您正在进行phong / gouraud照明,则会在某处计算法线和视图方向之间的余弦。余弦将为负值,您的图形卡将固定为零,从而导致黑色。

因此,如果明确指定了法线,则应尝试反转其方向 - >乘以-1。如果您只有顶点和面,则可能需要更改面中的顶点顺序。只需切换两个索引。 (1-2-3) - > (1-3-2)。这会将顺序从顺时针更改为逆时针(或反向)。要测试您的结果,您可以打开和关闭背面剔除,看看会发生什么。

答案 3 :(得分:0)

问题解决了。谢谢,但法线不是答案。我使用glutSolidSphere,所以normals没有错。尝试使用glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);那应该为你做的工作。

答案 4 :(得分:0)

当我制作天空穹顶,天空盒或天空飞机时,我实际上并没有点亮它。我只是在上面放一个纹理并渲染它。

glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
Render sky dome
glEnable(GL_LIGHTING);
glEnable(GL_CULL_FACE);

然而,问题在于改变状态可能很昂贵。因此,消除GL_CULL_FACE状态更改的一种方法是确保法线指向正确的方向。如果CULL_FACE设置为CCW(Counter ClockWise),则法线应指向您。但是,如果CULL_FACE设置为CW(ClockWise),那么法线应该指向远离你的方向。我可以看到消除GL_LIGHTING状态更改的唯一方法是使用着色器并定义自己的照明方案。但是,我不知道这是否更贵或更便宜。

天空盒问题是一个类似的故事,但它有其他问题。如果您的观点不在中心,则可能会遇到失真问题。我通常做的是首先渲染天空盒,以相机为中心,然后清除深度缓冲区并渲染其他所有内容。这样你的天空盒子就不必太大了。