游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3333|回复: 2

使用SetDepthStencilSurface()时出现了问题

[复制链接]

83

主题

169

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2010-3-2 21:05:00 | 显示全部楼层 |阅读模式
//我按照一下做法把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缓冲区中的内容)

15

主题

62

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2010-3-3 12:33:00 | 显示全部楼层

Re:使用SetDepthStencilSurface()时出现了问题

你可以用dxSDK 的pix工具调试一下shader查看一下,另外,你如果是要做shadowmap的话,你rendertarget clear的时候要清成全1才行,这样得到的深度才是比它近的。
还是建议你,pix调试一下看看渲染出来的样子

83

主题

169

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
 楼主| 发表于 2010-3-5 18:27:00 | 显示全部楼层

Re:使用SetDepthStencilSurface()时出现了问题

谢谢!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 17:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表