游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2322|回复: 3

DX镜面反射绘制出现异常

[复制链接]

3

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2010-3-15 20:49:00 | 显示全部楼层 |阅读模式
请教个问题,D3D中镜面反射
只有Stencil等于1的地方,才会绘制反射的物体
但是由于MESH的子集绘制顺序不确定
所以出现了不正确的画面
该如何解决

代码片段如下
-----------------------------------------------------------------------------------
        //镜面反射的图案只会在stencil为1的地方绘制成功
        HR(g_d3dDevice->SetRenderState(D3DRS_STENCILENABLE,    true));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC,      D3DCMP_ALWAYS));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILREF,       0x1));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILMASK,      0xffffffff));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILZFAIL,     D3DSTENCILOP_KEEP));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILFAIL,      D3DSTENCILOP_KEEP));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILPASS,      D3DSTENCILOP_REPLACE));

        //防止深度缓存和后台缓存被修改
    HR(g_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false));
    HR(g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true));
    HR(g_d3dDevice->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_ZERO));
    HR(g_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE));

        // 填充镜面的stencil缓存
        DrawMirror();
               
        HR(g_d3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, true ));
       
        HR(g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC, 3DCMP_EQUAL));
    HR(g_d3dDevice->SetRenderState(D3DRS_STENCILPASS,   D3DSTENCILOP_KEEP));

        // 建立镜面反射矩阵
        D3DXMATRIX R;
        D3DXPLANE plane(0.0f, 0.0f, 1.0f, 0.0f); // xy平面
        D3DXMatrixReflect(&R, &plane);

        D3DXMATRIX oldFighterWorld = m_FighterWorld;

        m_FighterWorld =  m_FighterWorld * R;

        //同样计算光照效果
        DirLight oldLight = m_Light;
        D3DXVec3TransformNormal(&m_Light.DirW, &m_Light.DirW, &R);
        HR(m_Effect->SetValue(mh_Light, &m_Light,sizeof(DirLight)));

        //忽略掉深度比较和alpha融合
        HR(g_d3dDevice->SetRenderState(D3DRS_ZENABLE, false));
        HR(g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false));

        // 绘制背面
        HR(g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW));
        DrawFighter(false);
       
        m_FighterWorld = oldFighterWorld;
        m_Light   = oldLight;
       
        // 恢复原有状态
        HR(g_d3dDevice->SetRenderState(D3DRS_ZENABLE, true));
        HR(g_d3dDevice->SetRenderState( D3DRS_STENCILENABLE, false));
        HR(g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW));

3

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-3-15 20:52:00 | 显示全部楼层

Re:DX镜面反射绘制出现异常

现在的问题是
关闭了zbuffer test,反射的图案就会出现异样,比如说主角携带一个背包
由于先绘制背包,再绘制主角,就导致背包被遮挡
但是打开zbuffer,又画不出反射物体(镜子总是在反射物体的前面)

0

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2010-3-23 17:07:00 | 显示全部楼层

Re:DX镜面反射绘制出现异常

镜面本身应该有透明的特性啊~~~   镜面本身应该是虚的东西,怎么会遮挡到反射物体呢?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2010-3-23 19:49:00 | 显示全部楼层

Re:DX镜面反射绘制出现异常

用shader rtt投影反射吧,这种方法局限性太大了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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