火星知识:Hardware Shadow Map
作者:cywater2000
日期:2009-3-1
来自:http://blog.csdn.net/cywater2000
今天无意中浏览某博客,在看到“HLSL没有,而GLSL有shadow2DProj”时,突然想到一个问题:有多少同学知道HLSL也可以实现Hardware Shadow Map的?
其实很简单: 如果显卡支持硬件级的Shadow Map,只要创建Shadow Map Texture的Usages为D3DUSAGE_DEPTHSTENCIL(D24S8和D16都可以),然后用SetDepthStencilSurface交给硬件渲染深度z到这个指定的z-buffer texture中(color write = disable),这样在读shadow map的时候(必须是含z的tex2D函数),硬件会自动比较深度,并返回0,1,或2x2的PCF过滤值(D3DTEXF_LINEAR)。
sampler g_samShadow = sampler_state
{
Texture = <g_txShadow>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = None;
AddressU = Clamp;
AddressV = Clamp;
};
//这里的Z很重要,一定要传进去才能让drivers自动比较
shadow = tex2Dlod(g_samShadow, float4(vLightTexCoord.xyz, 0)).x;
这个技术NVIDIA很早就在提了,而ATI类似的技术叫Fetch4。