记红龙书DX12——第十一章模板

在红龙书这本书的第十一章内,作者通过使用模板去限制后台缓存区的写入以达到一些特殊的效果,作者提供的十一章案例中使用了模板去绘制平面镜的效果以及阴影的效果,当然想要达到这些效果也不只有这种方式,还有一些其他的方式。

在这个案例中作者使用了五个渲染管线对象(PSO):

  1. 第一个opaque渲染不透明的物体,比如像地面、墙、案例中的骷髅头
  2. 第二个transparent渲染透明的物体,场景中的镜子
  3. 第三个markStencilMirrors在模板中绘制镜子
  4. 第四个drawStencilReflections通过模板测试去在后台缓存区中绘制骷髅头的镜像(这个镜像也是个游戏物体,是骷髅头原像的镜像,可见下图一)
  5. 第五个shadow绘制阴影
镜像(一)

镜像(一)

模板缓存是一块专门用来做特效的缓存区,它的开销并不大,但是它一般和blend在一起使用,混合的开销就比较大了,模板缓存与后台缓存一样大,模板缓存内每个像素点的大小都在0~255之间,它里面的数值可以自己设置,它的作用就是在向后台缓存区写入数据时,根据设置好的比对状态来比对,看是否能通过,不能通过的处理方式也是在比对状态中设置,能通过则进行深度测试。

程序内从上到下执行的程序步骤为:

    • 将地板、墙壁以及骷髅头实物照常通过opaque管线状态对象渲染到后台缓存区内,此步骤不会修改模板缓存,也不会渲染镜子。
    • 清理模板缓存,将其整体置零。此时的后台缓存区和模板缓存区可见下图(二),后台缓存区中蓝色为镜子(此时还未渲染所以为空的),模板缓存中黑色线条是后台缓存中模型对应的位置,实际在模板缓存中是不存在的。
    • 通过markStencilMirrors管线状态对象将镜面渲染到模板缓存中,此时应该禁止其他颜色写入到后台混存区,禁止深度缓存区的写入,在将镜子写入模板缓存的时候会进行深度测试(深度缓存区只是禁止写了,但是还是可以读的),即镜子覆盖地方的值都设为1(模板测试中的Value值),被骷髅头(下图立方体)遮住的地方不会被写入模板缓存区中,模板测试是通过我们自己设置的StencilRef模板参考值进行测试的测试的方式也是自己设置的,模板测试的过程类似于下面的代码StencilRef、StencilReadMask都是自己设置的,#为运算符(DX中的枚举类型设置)。
      	if (StencilRef & StencilReadMask # Value & StencilReadMask)
      		accept pixel;
      	else
      		reject pixel;
  • 将骷髅头镜像通过drawStencilReflections渲染管线状态对象写入到后台缓存区内,写入的过程中进行模板测试将StencilRef设置为1,只有模板测试中Value值为1的才可以通过测试,骷髅头才能写入。
  • 最后将镜子通过transparent管线状态对象渲染到后台缓存区中,transparent管线状态已经设置好了混合状态及方式。
后台缓存和模板缓存(二)

后台缓存和模板缓存(二)

后台缓存和模板缓存(三)

后台缓存和模板缓存(三)

这篇文章里我们介绍了游戏开发中平面镜子的一种渲染方式,在下一篇文章中我会介绍两种影子的渲染方式。

 

未经允许不得转载:他日重逢 » 记红龙书DX12——第十一章模板

赞 (2) 打赏

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 他日重逢ceshi回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

隐藏
变装