041-042 游戏中的阴影技术(2)

上传人:飞*** 文档编号:51128833 上传时间:2018-08-12 格式:PPT 页数:33 大小:1.95MB
返回 下载 相关 举报
041-042 游戏中的阴影技术(2)_第1页
第1页 / 共33页
041-042 游戏中的阴影技术(2)_第2页
第2页 / 共33页
041-042 游戏中的阴影技术(2)_第3页
第3页 / 共33页
041-042 游戏中的阴影技术(2)_第4页
第4页 / 共33页
041-042 游戏中的阴影技术(2)_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《041-042 游戏中的阴影技术(2)》由会员分享,可在线阅读,更多相关《041-042 游戏中的阴影技术(2)(33页珍藏版)》请在金锄头文库上搜索。

1、专业教程理论讲解部分网络游戏开发 高级应用第5章 游戏中的阴影技术第5章 游戏中的阴影技术Shadow Volume技术Shadow Mapping技术Shadow Volume技术Shadow Volume技术掌握Shadow Volume技术了解Shadow Mapping技术5.3 实时阴影技术 5.3.1 Shadow Volume技术第5章 游戏中的阴影技术能够随着光源和环境变化,动态产 生阴影的技术称为实时 阴影技术。阴影技术可以分为4类:1)用一个特定形状的黑色贴图来表示阴影;2)平面阴影;3)体积阴影技术(Shadow Volume) ;4)Shadow Mapping技术。5

2、.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术Shadow Volume技术的基本原理就是根据光源和遮蔽物的位置关系计算出场景中会产生阴影的区域,即阴影锥。然后对所有物体进行检测,以确定其会不会受阴影的影响。Shadow Volume最大的特点在于,它并不是利用“把物体投影到表面”的方式来产生阴影,而是去找出场景中,有哪些像素是在阴影中。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术在Direct3D中,所有模型都是由三角形面组成,根据光

3、源,可以绘制出阴影锥,即Shadow Volume。会和阴影锥有交集的像素,就是(1)+(2)-(3)的那些像素,也就是阴影所在的位置。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术可以利用模板缓冲区来得到(1)+(2)-(3)的那些像素。(1)在绘制(1)和(2)的面时,让模板缓冲区加1;(2)在绘制(3)的面时,让模板缓冲区减1。在画完(1)(3)时,那些模板(stencil)值不为0的像素就是阴影。(3)把所有模板不为0的像素利用Alpha混合的方式,使其亮度降低,就可以达到绘制阴影的效果。5.3 实时阴影技

4、术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术在具体的实现Shadow Volume时,有着不同的算法。 z-pass算法z-pass是Shadow Volume一开始的标准算法,用来确定某一个像素是否处于阴影当中。整个算法可以分为3步:(1)获取depth map(所有物体的深度值);(2)计算模板值;(3)判断像素是否处于阴影中。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-pass算法对于shadow volume的面对视点一面(front

5、face),如果深度测试的结果是通过(pass),那么和这个像素对应的模板值加1。如果深度测试的结果是失败(fail),模板值不变。而对于shadow volume的远离视点的一侧(back face),如果深度测试的结果是失败,模板值减1;如果成功,模板值不变。z-pass算法就是从视点向物体引一条射线,当这条射线进入 shadow volume时,模板值加1;当这条射线离开shadow volume时,模板值减1。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-pass算法采用z-pass 的算法时,物体与

6、阴影锥有如下3种关系:1)物体在阴影锥后。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-pass算法2)物体在阴影锥内部。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-pass算法3)物体在阴影锥前。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-pass算法一旦视点进入到了shadow volume里面,z-pass算法就会立即失效。5.3

7、 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-fail算法z-fail算法是John Carmack、Bill Bilodeau和Mike Songy各自独立发明的,其目的就是解决视点进入shadow volume后z-pass算法失效的问题。z-fail算法同样分为3步:1)获取depth map(所有物体的深度值);2)计算模板值;3)判断像素是否处于阴影中。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-fail算法z-fai

8、l算法的模板值计算方式与z-pass算法不同。对于它的背面(back face),如果深度测试的结果是失败,模板值加1,如果深度测试的结果成功,模板值不变;对于shadow volume的正面,如果深度测试的结果是失败,模板值减1,如果深度测试的结果是成功,模板值不变。z-pass算法的深度测试方向是从视点指向物体,而z-fail算法的深度测试方向正好相反。5.3 实时阴影技术 5.3.1 Shadow Volume技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-fail算法物体在阴影锥外部,可以得到正确的结果。5.3 实时阴影技术 5.3.1 Shadow Volum

9、e技术 1Shadow Volume技术原理第5章 游戏中的阴影技术 z-fail算法视点在阴影锥内部,同样可以得到正确的结果。5.3 实时阴影技术 5.3.1 Shadow Volume技术 2Shadow Volume的建立第5章 游戏中的阴影技术 基于CPU的方法所谓的阴影锥实际上就是从光源向物体的边缘做射线,射线延伸到一定距离或无穷远处得到的锥形。边缘指的是物体的轮廓线(silhouette edge),即从光源的角度看物体所得到的轮廓线。5.3 实时阴影技术 5.3.1 Shadow Volume技术 2Shadow Volume的建立第5章 游戏中的阴影技术 基于CPU的方法建立阴

10、影锥的过程分为5步:1)遍历模型的所有三角形;2)判断三角形面与光源的关系;3)对于面向光源的三角形,将所有的三条边压入一个栈,和已经存在的边进行比较,如果发现重复的边,则将重复的边都删除;4)检测过 所有三角形的所有边以后,栈里面剩下的边就是针对当前光源位置的物体的轮廓线;5)根据光源方向,利用CPU或者将这些轮廓线投射出去形成shadow volume。5.3 实时阴影技术 5.3.1 Shadow Volume技术 2Shadow Volume的建立第5章 游戏中的阴影技术 基于GPU的方法利用Vertex Shader来逐顶点的运算shadow volume。5.3 实时阴影技术 5.

11、3.1 Shadow Volume技术 3Shadow Volume的程序实现第5章 游戏中的阴影技术 建立阴影锥利用Vertex Shader来逐顶点的运算shadow volume。/遍历所有的面for( DWORD i=0; i= 0.0f )/这里添加的是一个反锥形,标准的算法是从光源开始的一个锥形/这里是从无限远处开始的一个锥形m_pVerticesm_dwNumVertices+ = *pV0;m_pVerticesm_dwNumVertices+ = *pV1;m_pVerticesm_dwNumVertices+ = -100*vLight;m_pVerticesm_dwNum

12、Vertices+ = *pV1;m_pVerticesm_dwNumVertices+ = *pV2;m_pVerticesm_dwNumVertices+ = -100*vLight;m_pVerticesm_dwNumVertices+ = *pV2;m_pVerticesm_dwNumVertices+ = *pV0;m_pVerticesm_dwNumVertices+ = -100*vLight;5.3 实时阴影技术 5.3.1 Shadow Volume技术 3Shadow Volume的程序实现第5章 游戏中的阴影技术 模板操作首先初始化模板缓冲区中的模板值。m_pDevice

13、-SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS );/stencile测试总是通过m_pDevice-SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );m_pDevice-SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP );/ If ztest passes, inc/decrement stencil buffer valuem_pDevice-SetRenderState( D3DRS_STENCILREF, 0x1 )

14、;m_pDevice-SetRenderState( D3DRS_STENCILMASK, 0xffffffff );m_pDevice-SetRenderState( D3DRS_STENCILWRITEMASK, 0xffffffff );m_pDevice-SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_INCR );/z检测通过时加15.3 实时阴影技术 5.3.1 Shadow Volume技术 3Shadow Volume的程序实现第5章 游戏中的阴影技术 模板操作分别绘制阴影锥的正面和背面。/画正面RenderVolume();/更

15、换背面裁剪模式m_pDevice-SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );m_pDevice-SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_DECR );/通过时减1/画反面RenderVolume();5.3 实时阴影技术 5.3.1 Shadow Volume技术 3Shadow Volume的程序实现第5章 游戏中的阴影技术 绘制阴影部分利用Alpha混合,改变阴影锥内部像素的颜色。/关闭深度测试,打开模板测试m_pDevice-SetRenderState( D3DRS_ZENABLE,

16、 FALSE );m_pDevice-SetRenderState( D3DRS_STENCILENABLE, TRUE );m_pDevice-SetRenderState( D3DRS_FOGENABLE, FALSE );m_pDevice-SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );m_pDevice-SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );m_pDevice-SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );5.3 实时阴影技术 5.3.2 Shadow

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号