sampler2DShadow偏置组件在GLSL中不起作用?

时间:2015-01-15 02:11:46

标签: opengl glsl shadow-mapping

我正在尝试在opengl core 3.3中实现阴影贴图。当我向GLSL中的纹理函数发送偏差时,它似乎根本不做任何事情。我使用它错了吗?

#version 330
uniform sampler2D diffusetex;
uniform sampler2D normaltex;
uniform sampler2D postex;
uniform sampler2D depthtex;

uniform sampler2DShadow shadowmap;
uniform mat4 shadowmat;

in vec2 uv;

layout (location=0) out vec4 outColor;


void main(){
    vec3 normal = normalize(texture(normaltex, uv).xyz);
    vec3 world_position = texture(postex, uv).xyz;

    vec4 shadowcoord = shadowmat*vec4(world_position, 1);
    float shadow = texture(shadowmap, shadowcoord.xyz,0.5);

    float luma = max(0.1,shadow);//ambient light
    outColor = texture(diffusetex, uv)*luma;
}

我正在使用linux,nvidia专有驱动程序和golang。怀疑它与它有什么关系,但为了以防万一,它就是。

1 个答案:

答案 0 :(得分:1)

如果您想避免阴影痤疮,则需要将该偏移量添加到实际纹理坐标。纹理查找函数中的可选[bias]参数用于LOD级别计算,它是“锐化”(负值)或“软化”(正值 )mipmap过滤。

在这种情况下,这将正确应用0.5:

的偏差
vec4 shadowcoord = shadowmat*vec4(world_position, 1);
shadowcoord.z += 0.5;

请记住,在窗口空间中, 0.5 是您的深度范围的 1 / 2 ,可能不是一个好的偏见。通常,良好的价值将接近 0.001 ; 0.5 可能会杀死你所有的阴影。