游戏开发论坛

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

渴望的效果

[复制链接]

4

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2009-7-6 17:31:00 | 显示全部楼层 |阅读模式



如上图,我希望的效果是,那个小茶壶不和大茶壶 不重叠显现, 可是仍然重叠显示了
于是把大茶壶那块的模板值设为0x1,...

代码如下(龙书里面的例子,改了一点点):
在一下函数之前,背景(大茶壶,墙,镜子)都渲染OK了
void RenderTwoTeapotAltering()//渲染背景里面(包括墙)的茶壶
{
        //设置镜子外茶壶的模板入口值为0x1,再设置参考值为0x1,比较操作为 等于
        //这样,最后渲染的镜子内茶壶遍不会覆盖境外茶壶啦
        Device->SetRenderState(D3DRS_STENCILENABLE,    true);
        Device->SetRenderState(D3DRS_STENCILFUNC,      D3DCMP_ALWAYS);
        Device->SetRenderState(D3DRS_STENCILREF,       0x1);
        Device->SetRenderState(D3DRS_STENCILMASK,      0xffffffff);
        Device->SetRenderState(D3DRS_STENCILPASS,      D3DSTENCILOP_REPLACE);
        //通过了深度测试和模板测试的地方,模板入口值为设定的参考值,否则,入口值不变
        Device->SetRenderState(D3DRS_STENCILZFAIL,     D3DSTENCILOP_KEEP);
        Device->SetRenderState(D3DRS_STENCILFAIL,      D3DSTENCILOP_KEEP);


        //不让茶壶渲染到深度缓冲
        Device->SetRenderState(D3DRS_ZWRITEENABLE, false);

        //不让茶壶渲染到后缓冲,即不画出来
        Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
        Device->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_ZERO);
        Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

        //因为模板测试总是成功,则茶壶画的地方,模板入口值可变为0x1
        D3DXMATRIX I;
        D3DXMatrixIdentity(&I);
        Device->SetTransform(D3DTS_WORLD, &I);
        Device->SetMaterial(&TeapotMtrl);
        Device->SetTexture(0,NULL);
        Teapot->DrawSubset(0);

        //后面要写入Z缓冲的,恢复更改Z缓冲功能
        Device->SetRenderState( D3DRS_ZWRITEENABLE, true );

        // only draw reflected teapot to the pixels where the mirror
        // was drawn to.
        Device->SetRenderState(D3DRS_STENCILFUNC,  D3DCMP_NOTEQUAL);
        Device->SetRenderState(D3DRS_STENCILPASS,  D3DSTENCILOP_KEEP);//不需要改变模板值了


        // position reflection
        D3DXMATRIX W, T, R;
        D3DXPLANE plane(0.0f, 0.0f, 1.0f, 0.0f); // xoy plane
        D3DXMatrixReflect(&R, &plane);

        D3DXMatrixTranslation(&T,
                TeapotPosition.x,
                TeapotPosition.y,
                TeapotPosition.z);

        W = T * R;
        Device->SetTransform(D3DTS_WORLD, &W);

        Device->SetMaterial(&TeapotMtrl);
        Device->SetTexture(0, 0);

        //将茶壶显示在最前面,甚至会镜子外茶壶的前边
        Device->Clear(0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);//仅注释它,看效果

        //使用颜色混合,改变茶壶在最前面的颜色,增加真实感
        Device->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_DESTCOLOR);//仅注释这两句,
        Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);//看效果
        //等价与  
        Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO);
        Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
        //当把摄像机转到镜子后面时,茶壶没了,是因为和黑色混合了

        Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
        Teapot->DrawSubset(0);//画对称的茶壶,背面消影
        Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);

        //关闭模板
        Device->SetRenderState( D3DRS_STENCILENABLE, false);
}

关于模板,以及三种类型的BUFFER,求指点。。。

11

主题

650

帖子

651

积分

高级会员

Rank: 4

积分
651
发表于 2009-7-6 17:43:00 | 显示全部楼层

Re:渴望的效果

你这是在给别人讲解还是?有点没看懂

你这个例子 模板缓存和alpha blend 都没正确吧
模板缓存是为了只在“镜子”上画 旁边没有

4

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2009-7-6 17:54:00 | 显示全部楼层

Re:渴望的效果

完全是请教,我在学模板,看了龙书中的例子,想改改看是否真的理解了,

我要实现的是,
1.墙 和 镜子 都能是镜子
但是镜子中的小茶壶不应该和大茶壶 有重合部分
不知道我的思路是不是对的:
我先把大茶壶处的模板值设为1 (茶壶以外的部分是0),参考值也为1
然后比较函数是 D3DCMP_NOTEQUAL
画小茶壶时,只有大茶壶处的模板测试会失败,

4

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2009-7-6 18:03:00 | 显示全部楼层

Re:渴望的效果

是不是因为 这个函数中画大茶壶时 的深度测试 失败了?

参考处:
D3DRS_ZWRITEENABLE
If FALSE, depth comparisons are still made according to the render state D3DRS_ZFUNC,
assuming that depth buffering is taking place, but depth values are not written to the buffer.

但是 原来的例子中 第二次画镜子部分
虽然D3DRS_ZWRITEENABLE 对应值仍为FALSE,
在能够看到的镜子部分 深度测试仍然成功了

4

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2009-7-6 20:11:00 | 显示全部楼层

Re:渴望的效果

该函数中,大茶壶的世界变换矩阵错了,不是单位阵

0

主题

43

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-7-8 22:59:00 | 显示全部楼层

Re:渴望的效果

呵,模版这东西1年多没碰,都忘了。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 19:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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