如何修复这个现有的阴影着色器/材料与alpha纹理?

我希望我能在这里得到一些帮助,最终解决这个我的问题:阴影投射与alpha纹理。

以下是我期待的结果:

在这里输入图像说明

我的一个朋友刚刚发送了这个着色器程序来帮忙,但我仍然无法正常工作。 像叶子这样的alpha纹理仍然留下矩形阴影。 我正在使用一个定制的基于Ogre的引擎,但总的来说,材质和合成器系统仍然是一样的。

附件: Alpha_Shader.zip

任何帮助将不胜感激。

谢谢。

为此,您必须在深度缓冲区创建片段着色器(在您的代码中为ShadowCasterFP)中对您的Alpha纹理进行采样。 当你对纹理进行采样时,你应该丢弃某个alpha级别以下的像素,或者做一个剪辑:

if( color.a<0.1 ) discard; clip( color.a<0.1?-1:1 ); //where color is your sampled texture at the current fragment 

这两个将执行相同的,这是不会输出任何颜色到你的rendertarget /深度图。

编辑:你必须插入上述代码(丢弃或剪辑)到您的MVSMShadows.hlsl到ShadowCasterFP函数的开始。 但是您还必须先采样纹理资源和采样器,然后您必须事先声明并上传到GPU。 你可以像这样声明纹理和采样器:

 Texture2D<float4> myTexture : register(t0); //texture bound to the first texture slot SamplerState mySampler : register(s0); //sampler unit bound to the first sampler slot 

然后,您必须在创建阴影贴图时对该贴图进行取样:

 float4 color = myTexture.Sample(mySampler,In.texCoords); 

所以你有你的片段颜色,其中包含一个阿尔法。 你检查alpha并放弃,如果它太低,剪辑或丢弃。