【问题标题】:LWJGL having shadows for the entire 3D environment [closed]LWJGL 具有整个 3D 环境的阴影 [关闭]
【发布时间】:2012-10-16 02:35:03
【问题描述】:

我在 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);
}

【问题讨论】:

  • 你用的是什么阴影算法?

标签: opengl lwjgl shadows


【解决方案1】:

我注意到光线只是穿过面,这意味着如果两个平面彼此相邻且光源位于一侧,则较远一侧的平面仍然亮着。

您将 OpenGL 误认为不是:OpenGL 不是场景图。 OpenGL 中没有内部场景表示。您发送它来绘制的每个点、线和三角形都是单独处理的,而不考虑正在绘制的任何其他点、线和三角形。事实上,OpenGL 的行为更像是一种复杂的纸和铅笔。

由于 OpenGL 不维护场景表示,因此它无法自行创建所谓的“全局照明”模型。因此,如果您想在场景中添加阴影,则由您来管理场景并实现绘制算法(使用 OpenGL),其结果看起来像阴影和全局照明。

您应该研究“Stencil Volume Shadows”和“Depth Buffer Shadow Maps”的主题。

【讨论】:

  • 我一直在寻找如何使用它们,但它们都不起作用
  • @JasperCreyf:你尝试了什么? “它不起作用”是可以想象的最通用、最不详细的错误描述。
  • @JasperCreyf:我接受了您的评论,因为您确实尝试自己实现算法。对于工作演示:这是一个模板阴影演示 humus.name/index.php?page=3D&ID=10,这是一个阴影映射演示(也可以使用颜色阴影!)humus.name/index.php?page=3D&ID=39
  • 谢谢。我发现了几个在 C 中的,但我根本不知道 C。这就是为什么在标题和标签中我有 LWJGL。我知道顶点和片段着色器文件在 C 中,这就是我一直在寻找示例的原因。
  • @JasperCreyf:语言并不重要,重要的是所涉及的算法的概念和思想。在 C 语言中所做的工作在 Java 的 OpenGL 绑定中是 1:1 的。不,着色器不是用 C 编写的,而是用 GLSL 编写的。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2012-11-04
  • 2014-10-01
  • 2021-11-17
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多