在OpenGL中渲染场景阴影的最简单方法是什么?

时间:2012-07-02 01:43:00

标签: java opengl rendering shadow lwjgl

我正在使用LWJGL包并且能够创建基本场景并绘制形状(带或不带纹理),移动自定义“相机”对象并旋转它以相应地渲染场景。然而,当谈到创造阴影时,我感到很茫然。

我可以想到创建阴影的基本算法 1)从相机的视图渲染场景,就像在阴影中一样 2)从灯光的视图渲染场景,点亮场景的可见部分(当场景变得离光源更远时,可能会使场景变暗?)。
3)从相机的视图重新渲染场景。

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

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

2 个答案:

答案 0 :(得分:1)

最简单的方法是,正如你已经解决的那样,从光的角度渲染场景。将深度贴图的内容保存为 shadowmap 纹理:每个深度最接近光源。然后再次渲染场景,并计算相对于光的位置的“世界”空间中的每个片段纹理坐标。将值与shadowmap进行比较:如果它更大,则该片段被遮蔽。

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

将它翻译成现代着色器不应该很难。

希望这有帮助。

答案 1 :(得分:0)

为了实现和理解,我会说光线跟踪阴影。基本上它会从地平面投射光线,并检查它是否会触及纹理上每个像素的任何内容。但它像疯了一样杀死了表演。因此,如果您真的想要,您可以进行一次光线计算并将其保存到纹理中,然后将其加载到水平/场景的开头。这根本不是动态的,但它确实有效。