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

有帮助吗?

解决方案

由于您位于球体内部,因此请尝试更改剔除模式。

我是 XNA 人,但这似乎是 OpenGL 等效项. 。我相信,如果您按照您所说打开了环境照明,那么无论法线如何,您都应该能够看到一些东西。

其他提示

尝试 翻转球体的法线 (更多搜索结果 这里)。一般来说,渲染引擎使用算法来确定哪些内容是不可能看到的,因此不应该被渲染;其中一项技术是 背面剔除。 我猜测球体是以典型的方式创建的,其中法线远离中心投射到球体之外;你需要你的法线面向相反的方向。

如果它是来自外部,而是来自内部黑暗点亮,那么它可能是球体的法线在错误的方向指向。

假设你正在做的Phong /高氏照明,正常和视图方向之间的余弦将被计算的某个地方。余弦将是负的和图形卡将钳位到零,这导致黑色。

所以,如果被明确指定你的法线,你应该尝试反向自己的方向 - >乘用-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(顺时针方向),那么法线应该从你背向。我可以看到,以消除GL_LIGHTING状态改变的唯一方式是使用着色器和定义自己的照明方案。然而,我不知道这是否是更多或更少的昂贵的。

在天空盒问题是一个类似的故事,但它也有其他的问题。如果你的观点是不是在中心,你可以运行到失真的问题。我通常做的是使天空盒第一,中心的相机,然后清除深度缓存和渲染一切。这样,你的天空盒并不一定是大的离谱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top