游戏引擎笔记(四)游戏中的阴影技术
几个重要的缓冲区:
1.后台缓冲区 Render Target View(渲染目标视图)
2.前台缓冲区 (不能直接绘制到前台缓冲区,会产生频闪现象)
使用翻转链(Swap Chain)机制 (前后台缓冲区分辨率相同)
超采样技术 将后台缓冲区的图像压缩到前台缓冲区,使图像密度提高
3.深度缓冲区
与后台缓冲区的像素信息一一对应
模板缓冲:(动态修改)
模板值用来控制某个像素是否能够被绘制在场景中,通过特定的处理,可以是程序渲染或是不渲染某些像素点。
工作原理:
D3D在模板缓冲上执行一个基于逐像素的测试。对于目标表面上的每一个像素,它使用模板缓冲中相应的值——模板参考值和模板掩码值来执行测试。
- 将模板参考值与模板掩码进行逐位AND运算。
- 将当前像素的模板值与模板掩码进行主谓AND运算。
- 用比较函数比较前两步得到的结果。
StencilRef & StencilReadMask ^ Value & StencilReadMask(参考值和掩码值由程序员设定)
当前像素是否显示由深度测试和模板测试共同决定。(若深度测试没有通过,则无需再进行模板测试)
模板缓冲的应用范畴:
可以使用模板缓冲来将2D或3D图像合成到一个3D场景中。
平面阴影:
获取某个物体在平面上的投影体,使用Alpha混合技术给投影体添加黑色然后利用模板缓冲,将投影体渲染到投影平面之上。
实时阴影技术:
能够随着光源和环境变化,动态产生阴影的技术称为实时阴影技术。
阴影技术可以分为四类:
- 用一个特定形状的黑色贴图来表示阴影
- 平面阴影
- 体积阴影(Shadow Volume)
- Shadow Mapping
Shadow Volume技术:
Shadow Volume技术的基本原理是根据光源和遮蔽物点额位置关系计算出场景中会产生阴影的区域,及阴影锥。然后对所有物体进行检测,已确定其会不会受阴影的影响。
Shadow Volume最大的特点在于,它并不是利用“把物体投影到表面“的方式来产生阴影,而是去找出场景中,有哪些像素是在阴影中。
在Direct3D中,所有模型都是有三角形面组成 ,根据光源,可以绘制出阴影锥,即Shadow Volume。
Shadow Volume技术原理:
可以利用模板缓冲区来得到1+2-3的那些像素
1)在绘制1和2的面时,让模板缓冲区加
2)在绘制3的面时,将模板缓冲区减1
3)把所有模板部位令的像素利用alpha混合方式使其亮度降低,就可以达到绘制阴影的效果。
Z-pass算法:
Z-pass是shadow volume一开始的标准算法,用来确定某一个像素是否处于阴影当中,整个算法可以分为三步:
1)获取depth map(所有物体的深度值)。
2)计算模板值。
3)判断像素是否处于阴影中。
对于shadow volume的面对视点一面(front face), 如果深度测试的结果通过(pass),那么和这个像素对应的模板值加1。如果深度测试的结果是失败的,模板值不变。而对于shadow volume的远离视点的一侧,如果深度测试的结果是失败,模板值减1,如果成功,模板值不变。
只能解决视点在阴影体外面的情况。
Z-fail算法:
Z-fail算法的模板值计算方式与z-pass算法不同
对于他的背面,如果测试的结果是失败的模板值加一,如果深度测试的结果成功,模板值不变。
对于shadow volume的正面,如果深度测试的结果是失败的,模板值减1,如果深度测试的结果是成功的,模板值不变。
基于CPU的方法:
所谓的阴影锥实际上就是从光源想物体的边缘做射线,射线延伸到一定距离或无穷远处得到的锥形。
边缘指的是物体的轮廓线,即从光源的角度看物体所得到的轮廓线。
建立阴影锥的过程分为5步:
1)遍历模型的所有三角形
2)判断三角形面与光源的关系
3)对于面向光源的三角形,将所有的三条边压入一个栈,和已经存在的边缘进行比较,如果发现重复的边,则将重复的边都删除。
4)检测过所有三角形的所有边以后,栈里面剩下的边就是针对当前光源位置的物体轮廓线
5)根据光源方向,利用CPU或者将这些轮廓线投射出去形成shadow volume。
本文作者:香菇0_0
本文链接:https://www.cnblogs.com/Xiang-gu/p/16512371.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步