Opengl 如何使用立方体贴图阴影的偏移

Opengl 如何使用立方体贴图阴影的偏移,opengl,3d,shadow-mapping,Opengl,3d,Shadow Mapping,所以,阴影贴图还有一个问题。我正在尝试使用立方体贴图阴影实现点光源,并且几乎可以正常工作 我正在将阴影渲染成一个类型为DEPTH_COMPONENT16的立方体贴图。我使用与平行光和聚光灯完全相同的着色器进行了6次扫描。我没有任何颜色输出,只使用深度缓冲区。我认为这应该没问题,因为立方体贴图几乎只有6个聚光灯,我没有任何问题 现在,当我尝试在我的照明着色器中采样阴影贴图时,我的问题来了。我的渲染器被延迟,因此我必须从深度重建所有位置 当我从立方体贴图中采样时,我会执行以下操作: // world

所以,阴影贴图还有一个问题。我正在尝试使用立方体贴图阴影实现点光源,并且几乎可以正常工作

我正在将阴影渲染成一个类型为DEPTH_COMPONENT16的立方体贴图。我使用与平行光和聚光灯完全相同的着色器进行了6次扫描。我没有任何颜色输出,只使用深度缓冲区。我认为这应该没问题,因为立方体贴图几乎只有6个聚光灯,我没有任何问题

现在,当我尝试在我的照明着色器中采样阴影贴图时,我的问题来了。我的渲染器被延迟,因此我必须从深度重建所有位置

当我从立方体贴图中采样时,我会执行以下操作:

// world space fragment to light
vec3 cubeNorm = normalize(w_pos - LB.position);
vec3 absNorm = abs(cubeNorm);
bool xy = absNorm.x > absNorm.y;
bool yz = absNorm.y > absNorm.z;
bool zx = absNorm.z > absNorm.x;
// which cube face will be sampled from
int index = 0; 
if (xy && !zx) index = 0 + int(cubeNorm.x < 0.f);
if (yz && !xy) index = 2 + int(cubeNorm.y < 0.f);
if (zx && !yz) index = 4 + int(cubeNorm.z < 0.f);
// point in light space with small normal offset
vec4 sc = LB.matArr[index] * vec4(w_pos+w_surf*0.06f, 1.f); 
vec4 shadcrd = vec4(cubeNorm, sc.z / sc.w * 0.5f + 0.5f);
// normals in view space
float bias = get_bias(v_surf, dirToPoint);
float vis = sample_shadow(shadcrd, bias, texShad);
示例_shadow函数:

float get_bias(vec3 _normal, vec3 _lightDir) {
    float lightDot = dot(_normal, -_lightDir);
    float magicTan = sqrt(1.f - lightDot * lightDot) / lightDot;
    return clamp(0.006f * magicTan, 0.f, 0.03f);
}
float sample_shadow(vec4 _sc, float _bias, samplerCubeShadow _tex) {
    return texture(_tex, vec4(_sc.xyz, _sc.w-_bias));
}
这就是我得到的。我禁用了“距离滚动”,以便更容易看到问题:

因此,偏置不能正常工作。调整get_bias函数以返回更大的值似乎没有帮助。唯一能消除粉刺的方法似乎是增加一个巨大的持续偏差,这显然不是一个选择

为了进行比较,这里是一个聚光灯,以90度fov在同一位置渲染。着色器使用相同的get_bias函数,并且近/远平面相同(0.2/5.0):


没有偏见的问题。我可以只使用6个聚光灯(没有圆角),但我宁愿使用立方体贴图。我做错了什么?

解决了这个问题。”这是一个简单的疏忽。该行:

vec3 cubeNorm = normalize(w_pos - LB.position);
应为正常偏移:

vec3 cubeNorm = normalize((w_pos+w_surf*0.06f) - LB.position);
此外,还有一种更好的方法来获得答案中的比较深度。但它确实需要近距离和远距离的飞机