我在OpenGL中遇到一些阴影问题。模型在每个面上都有一个阴影,OpenGL给它一个黑暗,通过面朝向光源的方向。我注意到光刚刚穿过面,这意味着如果两个平面彼此相邻并且光源位于一侧,则更远侧的平面仍然亮起。
我怎么能阻止这种情况发生?我需要一些适用于整个3D环境的影子代码。
private static void setUpLighting() {
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModel(GL_LIGHT_MODEL_AMBIENT, BufferTools.asFlippedFloatBuffer(new float[]{0.05f,
0.05f, 0.05f, 1f}));
glLight(GL_LIGHT0, GL_POSITION,
BufferTools.asFlippedFloatBuffer(new float[]{0, 0, 0, 1}));
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_TEXTURE_2D);
}
答案 0 :(得分:2)
我注意到光刚刚穿过面孔,这意味着如果两个平面彼此相邻并且光源位于一侧,则更远侧的平面仍然亮起。
你错误地将OpenGL误认为:OpenGL不是场景图。 OpenGL中没有内部场景表示。您发送的每个点,线和三角形都可以单独处理它,而不考虑任何其他点,线和三角形绘制。事实上,OpenGL更像是复杂的纸张和铅笔。
由于OpenGL不支持场景表示,因此它无法独立完成所谓的“全局照明”模型。因此,如果您想在场景中拥有阴影,那就是管理场景并实现绘图算法(使用OpenGL),其结果看起来像阴影和全局照明。
您应该查看“Stencil Volume Shadows”和“Depth Buffer Shadow Maps”的主题。