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

Java 在OpenGL中渲染场景阴影的最简单方法是什么?,java,opengl,rendering,shadow,lwjgl,Java,Opengl,Rendering,Shadow,Lwjgl,我使用LWJGL软件包,能够创建一个基本场景和绘制形状(有或没有纹理),移动一个自定义的“摄影机”对象并旋转它以相应地渲染场景。然而,当涉及到创建阴影时,我不知所措 我能想到创建阴影的基本算法。 1) 从摄影机的视图渲染场景,就像在阴影中一样。 2) 从灯光视图渲染场景,照亮场景的可见部分(可能会随着场景离光源越来越远而变暗)。 3) 从摄影机的视图重新渲染场景 但是,我不知道OpenGL的具体方法(特别是LWJGL)。在对这个主题的研究中,我只遇到过需要几何体的所有点和平面,或者只包含部分代码

我使用LWJGL软件包,能够创建一个基本场景和绘制形状(有或没有纹理),移动一个自定义的“摄影机”对象并旋转它以相应地渲染场景。然而,当涉及到创建阴影时,我不知所措

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

但是,我不知道OpenGL的具体方法(特别是LWJGL)。在对这个主题的研究中,我只遇到过需要几何体的所有点和平面,或者只包含部分代码的教程,而我自己的项目似乎无法使用这些代码


我想得对吗?如果是这样的话,我需要用什么方法对模型的可见部分进行着色(或做其他事情)?

最简单的方法是,如您所述,从灯光的角度渲染场景。将深度贴图的内容另存为阴影贴图纹理:每个深度都离光源最近。然后再次渲染场景,并计算“世界”空间中相对于灯光位置的每个碎片纹理坐标。将该值与阴影贴图进行比较:如果该值更大,则该片段被阴影覆盖

许多年前,我编写了一些旧的(预着色器)OpenGL代码来演示这一点。它在C中表示GLUT,但所有OpenGL位在LWJGL或JOGL中都有1:1的等价物。

将其转换为现代着色器等价物应该不难


希望这有帮助。

为了实现和理解,我会说光线跟踪阴影。基本上,它从地平面投射光线,并检查纹理上每个像素是否击中任何物体。但它疯狂地扼杀了表演。因此,如果确实需要,可以执行一次光线计算并将其保存到纹理,然后在level/scean的开始处加载。这完全不是动态的,但它是有效的。

可能与@genpfault重复我确实浏览了几个关于这个问题的类似主题,这个主题就是其中之一。我在谷歌上搜索了这些搜索词,但其中只有一种方法适用于我提到的算法。我尝试过一些使用矩阵数学来确定阴影的方法,但这些方法对我来说从来都不起作用。我不是在问如何准确地完成这项工作,而是问我将用于执行算法的方法调用。Hugh发布的代码或多或少使用了它,我可以准确地跟踪它……但不知什么原因,它不起作用。不过,我确实理解你对复制品的担忧。我通读了你的代码,从逻辑上讲,你是如何做到的。然而,我试图得到的只是背景。我不知道我做错了什么。我确实需要改变一些东西才能在我的上下文中工作(调用camera.and light.lookThrough()方法),并改变一些变量和东西。缓冲区直接通过BufferUtility类分配。渲染使用一个简单的drawPlanes()和camera.lookThrough(),但是用display()版本替换该方法不会绘制任何内容。实际上,我跟踪到了renderToShadowMap()方法末尾调用的GL11.glViewport方法,但是,注释掉该线会导致一侧的一个条带无法渲染场景,场景中也没有灯光(整个场景似乎都在阴影中)。进一步的测试再次修复了视口问题(以及让我意识到一些其他错误),但场景仍然处于完全阴影中(即使我没有调用enableShadowing()方法;如果我不调用renderToShadowMap()方法,它也会亮起)。很抱歉一直打扰您。在较新的系统上运行时,程序中有一些小故障(球不会反弹),但阴影仍然有效。抱歉,我没有足够的LWJGL专业知识来调试这个问题。