【问题标题】:What is the simplest method for rendering shadows on a scene in OpenGL?在 OpenGL 的场景中渲染阴影的最简单方法是什么?
【发布时间】:2012-07-02 01:42:59
【问题描述】:

我正在使用 LWJGL 包,能够创建基本场景并绘制形状(带或不带纹理)、移动自定义“相机”对象并旋转它以相应地渲染场景。但是,在创建阴影时,我不知所措。

我能想到创建阴影的基本算法。
1) 从摄像机的视角渲染场景,就像在阴影中一样。
2) 从灯光的角度渲染场景,照亮场景的可见部分(可能会随着场景远离光源而变暗?)。
3) 从相机的视角重新渲染场景。

但是,我不知道 OpenGL(尤其是 LWJGL)的特定方法。在研究这个主题后,我只遇到过需要几何图形的所有点和平面的教程,或者只包含我似乎无法为自己的项目工作的部分代码。

我是否正确地考虑了这一点?如果是这样,我需要使用哪些方法来对模型的可见部分进行着色(或做其他事情)?

【问题讨论】:

  • Creating OpenGL Shadows 的可能重复项
  • @genpfault 我确实浏览了有关该问题的几个类似主题,该主题就是其中之一。我用谷歌搜索了这些搜索词,但只有其中一种方法适用于我提到的算法。我尝试了一些使用矩阵数学来确定阴影的方法,但从来没有对我有用。我不是在问如何准确地做到这一点,而是在问我将用来执行算法的方法调用。 Hugh 发布的代码或多或少使用了它,我可以完全按照它进行操作……但由于某些未知原因,它不起作用。不过,我确实理解您对重复的担忧。

标签: java opengl rendering shadow lwjgl


【解决方案1】:

如您所见,最简单的方法是从灯光的视点渲染场景。将深度贴图的内容保存为 shadowmap 纹理:每个深度距离光源最近。然后再次渲染场景,并计算每个片段在“世界”空间中相对于灯光位置的纹理坐标。将值与 shadowmap 进行比较:如果更大,则该片段被遮蔽。

许多年前,我编写了一些旧的(预着色器)OpenGL 代码来演示这一点。它在 C 中用于 GLUT,但所有 OpenGL 位在 LWJGL 或 JOGL 中都有 1:1 等效项。 http://cs.anu.edu.au/~hugh.fisher/3dstuff/shadows.tar

将其转换为等效的现代着色器应该不难。

希望这会有所帮助。

【讨论】:

  • 我通读了你的代码,从逻辑上看你是怎么做的。然而,我对port the code 的尝试只产生了背景。我不知道我做错了什么。我确实必须更改一些东西才能在我的上下文中工作(调用相机。和 light.lookThrough() 方法)并更改几个变量和东西。缓冲区是通过我的 BufferUtility 类直接分配的。使用简单的 drawPlanes() 和 camera.lookThrough() 进行渲染,但是用您的 display() 版本替换该方法不会绘制任何内容。
  • 其实我追到了在renderToShadowMap()方法最后调用的GL11.glViewport方法,但是注释掉这行导致边上的bar不渲染场景,也不是有灯光的场景(整个场景似乎都在阴影中)。
  • 再一次进一步的测试已经修复了视口问题(以及让我意识到其他几个错误),但场景仍然处于完全阴影中(即使我没有调用 enableShadowing( ) 方法;如果我不调用 renderToShadowMap() 方法,它就会亮起)。很抱歉一直困扰您。
  • 程序在较新的系统上运行时会出现一些故障(球不会反弹),但阴影仍然有效。抱歉,我没有足够的 LWJGL 专业知识来调试问题。
【解决方案2】:

为了实现和理解,我会说光线追踪阴影。基本上,它从地平面投射光线并检查它是否击中纹理上每个像素的任何东西。但它会疯狂地扼杀表演。因此,如果您真的想要,您可以进行一次光线计算并将其保存到纹理中,然后在关卡/扫描开始时加载它。这根本不是动态的,但它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2011-02-20
    • 2023-03-23
    • 2017-06-30
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多