Opengl 远离光源的对象投射的阴影

Opengl 远离光源的对象投射的阴影,opengl,shadow,Opengl,Shadow,我有一个问题,物体投射的阴影离光源很远。我在太阳系模拟中使用深度贴图方法渲染阴影。太阳是一个点光源,我想观察月球在地球上的影子。但是,由于月球相对于它与太阳之间的距离而言是一个非常小的对象,而且深度贴图分辨率有限,因此在渲染深度立方体贴图纹理时,月球和地球的存在将被忽略 太阳系深度图: 你可以看到,即使月球的大小被夸大了,它在深度立方体地图上也只留下一个很小的足迹。对于这么大的一个月亮,日食确实有效,但一旦我将月亮缩小到它的实际大小,它就不再在深度贴图中渲染,因此,阴影计算不再考虑它。我使用的

我有一个问题,物体投射的阴影离光源很远。我在太阳系模拟中使用深度贴图方法渲染阴影。太阳是一个点光源,我想观察月球在地球上的影子。但是,由于月球相对于它与太阳之间的距离而言是一个非常小的对象,而且深度贴图分辨率有限,因此在渲染深度立方体贴图纹理时,月球和地球的存在将被忽略

太阳系深度图:


你可以看到,即使月球的大小被夸大了,它在深度立方体地图上也只留下一个很小的足迹。对于这么大的一个月亮,日食确实有效,但一旦我将月亮缩小到它的实际大小,它就不再在深度贴图中渲染,因此,阴影计算不再考虑它。我使用的是4096 X 4096纹理。有没有办法解决这个问题,或者我的方法注定要失败?任何帮助都将不胜感激。

有一个重要的观察结果要做:当你近距离观察地球时,你可能并不关心火星上的阴影。因此,与其使用立方体贴图对整个太阳系进行阴影贴图,不如使用平面阴影贴图仅覆盖近地区域

使用4096x4096深度图和384000公里到月球的距离,您可以获得每特克斯约100公里的分辨率,月球将在阴影图上占据半径约20特克斯的圆盘

然而,有一种更好的方法。由于行星和卫星是近似球形的,并且只有少数几个,所以您可以简单地对每个碎片进行光线-球体相交来计算阴影。为了获得实时本影/半影渲染,可以计算月球和太阳圆盘之间交点的角度面积。下面是一个近似着色器中阴影因子的函数:

float soft_shadow(vec3 light, float light_radius,
    vec3 occluder, float occluder_radius, vec3 fragment)
{
    vec3 v0 = light - fragment;
    vec3 v1 = occluder - fragment;

    float R0 = length(v0);
    float R1 = length(v1);

    float a0 = light_radius/R0;
    float a1 = occluder_radius/R1;

    float a = length(cross(v0, v1))/(R0*R1);
    a = smoothstep(a0 - a1, a0 + a1, a);
    return 1 - (1 - a)*pow(a1/a0, 2);
}
这里
0.0
表示完全阴影,
1.0
表示完全没有阴影。
遮光罩
碎片
是太阳、月亮和碎片在非投影空间中的位置,而
光半径
遮光罩
是太阳和月亮的半径

对于真实尺寸,此代码为我提供以下图像:

如果我把太阳的大小减少一半,我会得到:


您确定深度贴图是处理此类场景中阴影的好方法吗?因为你有一个很小的物体,阴影体积可能更适合你。我不确定这是最好的方法。这就是我问的原因。阴影贴图是我知道的唯一方法。因为我不得不暂时停止这个项目,我忘了告诉你你帮了我多少忙。我是个新手,我花了很多令人尴尬的时间试图为我的问题找到一个足够准确的解决方案。我知道,也许你给了我一个看似微不足道的计算,但我只是想让你知道,这对我来说是最有用的,我真的很感谢你的时间。