|
//我按照一下做法把Z-Buffer保存到了一个Surface中
DirectDevice.GetDirectDevice()->SetDepthStencilSurface(pRenderStencilMapSurface);
DirectDevice.GetDirectDevice()->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(100, 0, 100), 1.0f, 0);
pEffect->BeginPass(1); //不止一个Pass
for(DWORD i=0;i<BasicXFile.m_dwMaterials;i++)
{
BasicXFile.m_pD3DXMesh->DrawSubset(i);
}
pEffect->EndPass();
//然后把pRenderStencilMapSurface传到效果程序中
pEffect->SetTexture("RenderStencilMap",DirectDevice.pRenderStencilMap);
///////在效果代码中
void MakeShadow2VS(float3 pos : POSITION,
float3 normal : NORMAL,
out float4 oPos : POSITION,
out float4 Color : COLOR,
out float4 BgUV : TEXCOORD0,
out float4 LProj : TEXCOORD1)
{
float4 p_World=mul(float4(pos.xyz, 1.0), mWorld);
float4 p_LampProj=mul(p_World,Lamp0ViewProj);
p_LampProj=p_LampProj/p_LampProj.w;
float4x4 Temp=MakeShowBias(0.01);
LProj=mul(p_LampProj,Temp);
LProj=p_LampProj;
oPos=mul(float4(pos.xyz, 1.0),mWorldViewProj);
Color=float4(dot(Lamp0Point,normal)*Lamp0Color,1.0);
BgUV=oPos;
}
void MakeShadow2PS(float4 BgUV : TEXCOORD0,
float4 LProj : TEXCOORD1,
out float4 Color : COLOR)
{
float shadowed = tex2Dproj(RenderStencilMapSampler,LProj);
float2 sp = 0.5 * float2(BgUV.x/BgUV.w,BgUV.y/BgUV.w);
sp += float2(0.5,0.5);
sp.y = 1.0 - sp.y;
//float4 BgColor = tex2D(SceneTextureSampler,sp);
//Color=float4(saturate(shadowed+0.1)*BgColor.rgb+float3(0.1,0.1,0.1),BgColor.a);
Color=shadowed;
}
//这里获得的Color值怎么恒为0啊?
//我觉得应该是根据shadowed = tex2Dproj(RenderStencilMapSampler,LProj);来获得
//RenderStencilMapSampler中的Z值和LProj.z/LProj.w比较大小,来确定shadowed的值是 0 还是 1
//在FX Composer中编译的效果正确,但是visual studio中shadowed的值一直是0
是不是我在主程序中SetDepthStencilSurface(pRenderStencilMapSurface);部分有错误啊,没有把Z-Buffer保存在Surface中。
有没有方法可以吧pRenderStencilMapSurface把存在一张jpg图片中,直接擦看错误原因?(利用D3DXSaveSurfaceToFile好像只能存颜色缓冲区,不能存Z缓冲区中的内容) |
|