我正在尝试对我的 shaow 贴图实施 PCF 过滤,因此修改了 GPU Gems 文章 ( http://http.developer.nvidia.com/GPUGems/gpugems_ch11.html ),以便它可以在当前着色器上运行。修改包括用 Texture2D.Sample() 函数替换 tex2Dproj 函数,以便它接受在 DirectX11 中创建的采样器状态。然后我将偏移值与法线阴影贴图比较:
float2 ShTex;
ShTex.x = PSIn.ShadowMapSamplingPos.x/PSIn.ShadowMapSamplingPos.w/2.0f +0.5f;
ShTex.y = -PSIn.ShadowMapSamplingPos.y/PSIn.ShadowMapSamplingPos.w/2.0f +0.5f;
float realDistance = PSIn.ShadowMapSamplingPos.z/PSIn.ShadowMapSamplingPos.w;
(realDistance - xShBias) <= offset_lookup(xTextureSh, texSampler, ShTex, float2(x, y), scale); //Blocker-receiver comparison (the usual stuff, only that it gets 4*4 samples from near offsets then divides the final value with 16)
现在我得到的回报是:
它在文章中的哪里说并表明硬件应该神奇地插入结果。我猜 tex2Dproj 可能会这样做,但没有成功让它工作。
最近我遇到了 SampleCmpLevelZero 函数,我在这个采样器状态下尝试过:
SamplerComparisonState cmpSampler
{
Filter = COMPARISON_MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
ComparisonFunc = LESS;
};
当我让它工作时,整个场景随机地从阴影闪烁到无阴影和部分阴影(这似乎是正确的阴影)。
xTextureSh.SampleCmpLevelZero( cmpSampler, ShTex.xy, realDistance - xShBias );
可悲的是,我找到了一个有同样问题的人,但他通过将过滤器重写为我已经应用的模式来修复它。
我的深度纹理采用以下格式:DXGI_FORMAT_R24_UNORM_X8_TYPELESS
我现在对这个关于正确 PCF 过滤的谜团感到非常困惑,有没有人可以提出任何建议?提前感谢您阅读全文。