游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3484|回复: 6

shadow volume

[复制链接]

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
发表于 2007-10-28 10:50:00 | 显示全部楼层 |阅读模式

//禁用z缓冲区写操作, 并启用模板缓冲区
    pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE,  FALSE );
    pd3dDevice->SetRenderState( D3DRS_STENCILENABLE, TRUE );
//只更新深度模板缓冲区

pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_ZERO );
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
//渲染阴影体前面
pd3dDevice->SetRenderState( D3DRS_STENCILFUNC,  D3DCMP_ALWAYS );
    pd3dDevice->SetRenderState( D3DRS_STENCILPASS,  D3DSTENCILOP_INCR );
pd3dDevice->SetTransform( D3DTS_WORLD, pmatWorld );
pd3dDevice->SetFVF( D3DFVF_XYZ );
    pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLELIST, m_dwNumVertices/3,
                         m_pVertices, sizeof(D3DXVECTOR3) );

//渲染阴影体背面
pd3dDevice->SetRenderState( D3DRS_CULLMODE,   D3DCULL_CW );
pd3dDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_DECR );
pd3dDevice->SetTransform( D3DTS_WORLD, pmatWorld );
pd3dDevice->SetFVF( D3DFVF_XYZ );
    pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLELIST, m_dwNumVertices/3,
                         m_pVertices, sizeof(D3DXVECTOR3) );

//恢复渲染状态
pd3dDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
    pd3dDevice->SetRenderState( D3DRS_CULLMODE,  D3DCULL_CCW );
    pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE,     TRUE );
    pd3dDevice->SetRenderState( D3DRS_STENCILENABLE,    FALSE );
    pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
上面是和渲染相关的代码,书上说绘制前面的时候模板缓冲去的内容加1,绘制反面的时候模板缓冲区的内容减1,如果最终模板缓冲区的内容大于1,就说明这个地方是阴影体内部。
其实我不理解的是,一个裁剪正面和裁剪背面有什么区别哪,无论正面还是反面应该都有相同的深度信息,上面的例子中模板缓冲又都是D3DCMP_ALWAYS,也就是说渲染成败的所有信息都是靠深度测试,但是如果正面和反面的深度又都是一样,那又是怎么区别是不是在阴影体内部啊,这个问题郁闷我很久了, 请大家指点下

[em7]

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-10-29 22:44:00 | 显示全部楼层

Re:shadow volume

正面和反面的深度一样吗?不一样吗?一样吗?....

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2007-10-30 13:03:00 | 显示全部楼层

Re:shadow volume

晕拉,不一样的话是怎么个不一样哪,正面和方面的深度信息各是什么样的哪,打个比方,墙的后面有一个篮球,我想无论后面或者前面的深度都应该小于篮球的深度吧(假设你站在墙前面,篮球被墙挡住),如果说墙是一个四边形的话,那么正面和反面其实坐标点是完全一样的,那深度干吗不一样哪?
pd3dDevice->SetRenderState( D3DRS_CULLMODE,   D3DCULL_CW );
上面的函数我的理解仅仅是指定顺时针或者逆时针画的面哪个是正反而以,这个和改变深度信息有什么关系哪,真的很郁闷,请知道的赐教 [em6]

36

主题

197

帖子

197

积分

注册会员

Rank: 2

积分
197
发表于 2007-10-30 16:56:00 | 显示全部楼层

Re:shadow volume

影锥,原理有点像平面内,判断任意一点是否在一个多边形内,只需要判断,这一向任意方向做一条射线,如果这条射线和凸多边形有奇数个交点,就说明这个点在途多边形内

影锥也是一样

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2007-10-30 18:24:00 | 显示全部楼层

Re:shadow volume

谢谢楼上,原理我知道,我只是不知道上面的代码是怎么体现原理的,具体点就是:
pd3dDevice->SetRenderState( D3DRS_CULLMODE,   D3DCULL_CW );这个函数改变裁剪面怎么就会影响模板缓存以及深度缓存哪.任何一个面都有正反之分,我改变这个属性按照我的理解只是让管线决定哪个面渲染哪个面不渲染而以,其他会引起深度信息不同什么的就不清楚了,还请继续指点下

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-10-30 23:21:00 | 显示全部楼层

Re:shadow volume

同一个模型,裁剪方式不同,绘制的三角形就不同,深度当然不同。

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2007-10-31 08:26:00 | 显示全部楼层

Re:shadow volume

现在大家已经确定不同了,能不能说的再具体点,就是怎么个不同,比如说画一个三角行,现在人的眼睛就看着正面,我们先画正面,然后画反面,大家说下到底哪个深度更低点,其实深度是表示点到眼睛的距离,正面和反面的点到眼睛的距离应该都一样吧,谁能具体再解释下,就把这个帖子都扫盲帖算了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-19 12:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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