我有这个问题:我需要制作一个看起来像真实天空的场景。我的第一个想法是制作一个立方体并对其进行纹理化。没那么好看。我想出了使用球体的想法。但我不能从里面点燃它。我已经把相机放在原点观看(0,0,-100)。环境和镜面光源也在原点。看不到任何东西亮着!制作天空的方法是什么?如何照亮球体的内部?
5 回答
尝试更改剔除模式,因为您位于球体内部。
我是 XNA 的人,但看起来这将是OpenGL 的等价物。我相信,如果您按照您所说的那样打开环境照明,那么无论正常情况如何,您都应该能够看到一些东西。
如果它是从外面照亮的,但从里面看是黑暗的,那么可能是球体的法线指向错误的方向。
假设您正在使用 phong/gouraud 照明,法线和视图方向之间的余弦将在某处计算。余弦将为负数,您的图形卡将钳位为零,从而导致黑色。
因此,如果您的法线被明确指定,您应该尝试反转它们的方向 -> 与 -1 相乘。如果您只有顶点和面,您可能需要更改面中的顶点顺序。只需切换两个索引。(1-2-3) -> (1-3-2)。这会将顺序从顺时针更改为逆时针(或反向)。为了测试你的结果,你可以打开和关闭背面剔除,看看会发生什么。
问题解决了。谢谢,但法线不是答案。我使用 glutSolidSphere,所以法线没有错。尝试使用 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); 那应该为你做这项工作。
当我制作天空穹顶、天空盒子或天空飞机时,我实际上并没有点亮它。我只是在上面放了一个纹理并渲染它。
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
Render sky dome
glEnable(GL_LIGHTING);
glEnable(GL_CULL_FACE);
然而,这样做的问题是改变状态可能很昂贵。因此,消除 GL_CULL_FACE 状态更改的一种方法是确保您的法线指向正确的方向。如果 CULL_FACE 设置为 CCW(逆时针),那么法线应该指向您。但是,如果 CULL_FACE 设置为 CW (ClockWise),那么法线应该指向远离您的方向。我能看到消除 GL_LIGHTING 状态变化的唯一方法是使用着色器并定义自己的照明方案。但是,我不知道这是否更贵或更低。
天空盒问题是一个类似的故事,但它还有其他问题。如果您的视点不在中心,您可能会遇到失真问题。我通常做的是先渲染天空盒,以相机为中心,然后清除深度缓冲区并渲染其他所有内容。这样你的天空盒就不必大得离谱。