游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2381|回复: 5

大家好,问一个stencil buffer做镜像时zbuffer的问题!

[复制链接]

43

主题

155

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2005-3-5 21:27:00 | 显示全部楼层 |阅读模式
用stencil buffer实现镜像,场景绘制过程如下:

// 绘制地板、墙等
...

// 绘制镜子, 位于xy平面上
m_pDevice->SetMaterial( &m_MirrMtrl );
m_pDevice->SetTexture( 0, m_pTexMirr );
m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 18, 2 );

// 绘制茶壶, <0.0f, 3.0f, -7.5f>
D3DXMatrixTranslation( &matTrans, m_TeapotPos.x, m_TeapotPos.y, m_TeapotPos.z );
matWorld = matTrans;
m_pDevice->SetTransform( D3DTS_WORLD, &matWorld );
m_pDevice->SetMaterial( &m_TeapotMtrl );
m_pDevice->SetTexture( 0, 0 );
m_pTeapot->DrawSubset( 0 );

// 设置stencil buffer,写入公式中的各个参数
m_pDevice->SetRenderState( D3DRS_STENCILENABLE, true );
m_pDevice->SetRenderState( D3DRS_STENCILREF, 0x1 );
m_pDevice->SetRenderState( D3DRS_STENCILMASK, 0xffffffff );
m_pDevice->SetRenderState( D3DRS_STENCILWRITEMASK, 0xffffffff );
m_pDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS );
m_pDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );
m_pDevice->SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP );
m_pDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE );

m_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, false );
m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ZERO );
m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );

// 绘制场景,镜子对应的stencil buffer清为1
D3DXMatrixIdentity( &matWorld );
m_pDevice->SetTransform( D3DTS_WORLD, &matWorld );
m_pDevice->SetStreamSource( 0, m_pVBScene, 0, sizeof( Vertex ) );
m_pDevice->SetFVF( Vertex::FVF );
m_pDevice->SetMaterial( &m_MirrMtrl );
m_pDevice->SetTexture( 0, m_pTexMirr );
m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 18, 2 );

m_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, true );
m_pDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_EQUAL );
m_pDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_KEEP );

// 现在绘制镜子中的茶壶, 求反射矩阵
D3DXMATRIX matMirr;

D3DXPLANE plane( 0.0f, 0.0f, 1.0f, 0.0f );
D3DXMatrixReflect( &matMirr, &plane );
D3DXMatrixTranslation( &matTrans, m_TeapotPos.x, m_TeapotPos.y, m_TeapotPos.z );

matWorld = matTrans * matMirr;
m_pDevice->SetTransform( D3DTS_WORLD, &matWorld );

// 在这里清zbuffer为1,
m_pDevice->Clear( 0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0 );
m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR );
m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );

// 绘制
m_pDevice->SetTexture( 0, 0 );
m_pDevice->SetMaterial( &m_TeapotMtrl );
m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
m_pTeapot->DrawSubset( 0 );

m_pDevice->EndScene();
m_pDevice-&gtresent( 0, 0, 0, 0 );

我的问题是,清zbuffer后在原茶壶镜面对称的位置绘制镜像茶壶,为什么镜像茶壶没有覆盖离镜头最近的原茶壶的像素??
sf_200535212737.jpg

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-3-6 20:22:00 | 显示全部楼层

Re:大家好,问一个stencil buffer做镜像时zbuffer的问题!

m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );

你两面都画就好了,改成D3DCULL_NONE或者CCW都应该可以。

43

主题

155

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-3-7 18:18:00 | 显示全部楼层

Re:大家好,问一个stencil buffer做镜像时zbuffer的问题!

大侠您说的是我想问的另一个问题,这里设置为cw或者ccw对最终成像都没有影响?

我困惑的是在绘制镜像茶壶之前将zbuffer清为1,
    m_pDevice->Clear( 0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0 );
这之后再绘制镜像茶壶, 这么做的原因是镜子完全遮盖了镜像茶壶,清zbuffer后才能使位于镜子之后的镜像茶壶可见,然后再用alpha混合得到镜子“里”的茶壶的效果。可是从最终图像可以看到镜像茶壶和原茶壶象素也有重叠的部分(看盖子),这部分象素为什么没有进行alpha混合造成不正确的覆盖现象呢?

43

主题

155

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-3-8 14:09:00 | 显示全部楼层

Re:大家好,问一个stencil buffer做镜像时zbuffer的问题!

我顶~~ 没人看麽? -_-|||

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-3-8 14:33:00 | 显示全部楼层

Re:大家好,问一个stencil buffer做镜像时zbuffer的问题!

还是没明白你究竟想要干什么,其实不用清z-buffer,直接把zfunc改成always就可以了。

43

主题

155

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-3-8 18:04:00 | 显示全部楼层

Re:大家好,问一个stencil buffer做镜像时zbuffer的问题!

看来是我没说清楚~~~

附件的图就是我要的效果了,模拟镜像,或者说一个茶壶在照镜子... -_-|||

不清zbuffer无法绘制镜像茶壶啊,因为镜像茶壶的位置在镜子后面;清掉zbuffer(或者改zfunc也行)后镜像茶壶已经和镜子正确混合绘制了,可是从图上可以看到镜像茶壶和原茶壶也有重叠的区域,我的问题是,这部分象素为什么没有进行alpha混合导致不正确的结果??????
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-24 17:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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