我一直在努力为我的阴影映射实现百分比近似过滤,如Nvidia GPU Gems
所述当我尝试使用统一的sampler2DShadow和shadow2D或shadow2DProj对阴影贴图进行采样时,GLSL编译失败并给我错误
shadow2D deprecated after version 120
我如何在GLSL 330+中实施等效解决方案?我目前只使用二进制纹理样本和Poisson Sampling,但是阶梯混叠非常糟糕。
答案 0 :(得分:14)
你的头衔远离基础。 sampler2DShadow
不 已弃用。在GLSL 1.30中唯一改变的是,texture1D
,texture2D
,textureCube
,shadow2D
等函数的混乱都被{{3 }}
texture (...)
的重载相当于shadow2D (...)
:float texture(sampler2DShadow sampler,
vec3 P,
[float bias]);
使用此重载进行查找的纹理坐标为:P.st
,用于深度比较的引用值为P.r
。对于绑定到阴影采样器纹理图像单元的纹理/采样器对象,启用纹理比较(GL_TEXTURE_COMPARE_MODE
== GL_COMPARE_REF_TO_TEXTURE
)时,此重载才能正常工作;否则结果是不确定的。
从GLSL 1.30开始,你需要使用不同的纹理查找功能的唯一一次是当你做一些根本不同的事情时(例如纹理投影=> textureProj
,请求一个精确的LOD => {{ 1}},通过整数坐标/样本索引=> textureLod
等获取纹素。具有比较的纹理查找(阴影采样器) 不 被认为根本不同,需要其自己的专用纹理查找功能。
在texture (...)
上对此进行了详尽的介绍。
答案 1 :(得分:1)
您需要使用textureProj
,它会返回float
而不是vec4
。
概述了阴影伪像和解决方案(包括泊松采样)here。