我正在使用LWJGL包,能够创建一个基本场景并绘制形状(有或没有纹理),移动自定义“相机”对象并旋转它以相应地渲染场景。然而,当谈到创建阴影时,我不知所措。
我能想到创建阴影的基本算法。
1)从相机的角度渲染场景,就像在阴影中一样。
2)从光线的角度渲染场景,照亮场景的可见部分(也许随着场景离光源越来越远而变暗?)。
3)从相机的角度重新渲染场景。
然而,我不知道OpenGL(特别是LWJGL)的特定方法。在研究这个主题时,我只遇到了需要几何的所有点和平面的教程,或者只包含我似乎无法为自己的项目工作的部分代码。
我是否正确地考虑了这个问题?如果是,我需要使用什么方法来着色模型的可见部分(或做其他事情)?
最简单的方法是从光线的角度渲染场景。将深度图的内容保存为阴影图纹理:每个深度最接近光源。然后再次渲染场景,并计算“世界”空间中相对于光线位置的每个片段纹理坐标。将值与阴影图进行比较:如果它更大,则此片段被阴影化。
许多年前,我编写了一些旧的(预着色器)OpenGL代码来演示这一点。它在C中表示GLUT,但所有OpenGL位在LWJGL或JOGL中具有1:1的等效项。http://cs.anu.edu.au/~hugh.fisher/3dstuff/shadows.tar
将其转换为现代着色器等价物应该不难。
希望这有帮助。
为了实现和理解,我会说光线跟踪阴影。基本上它从接地平面投射光线,并检查它是否击中纹理上每个像素的任何东西。但是它会疯狂地杀死性能。所以如果你真的想,你可以做一次光线计算并将其保存到纹理中,然后在关卡/场景的开始加载它。这一点也不动态,但它有效。