可以“切割”所有几何形状的孔的着色器


11

如何创建“切割”所有几何图形的着色器,仅在Unity中渲染清除背景?一个例子:

在此处输入图片说明

那是一个巨大的白色盒子形房间里的棱镜。棱镜的表面只是渲染场景的天空盒(星空)。我使用了多个摄像头,效率很低...必须有一种仅使用着色器的方法。

我怎样才能做到这一点?

Answers:


15

好吧,终于明白了!

在此处输入图片说明

您将看到球体网格如何“切割”圆柱体和平面,一直到天空盒。这花了我比预期更长的时间解决了这个问题,但是由于有了Wiki页面(http://wiki.unity3d.com/index.php/DepthMask),我才将所有内容整理了一下。

在Wiki页面中使用着色器设置之前,我使用了具有不同清除/深度标记的三个不同的摄像机来获得相同的结果。它奏效了,但在Ouya上完全窒息了。上述解决方案仅需要一台摄像机,并且运行速度很快。

所以我像这样设置场景

  1. 添加了一个现实的Skybox(NASA)

  2. 添加了一些形状

  3. 将SetRenderQueue脚本添加到平面,球体和圆柱体

  4. 将球体上的队列顺序设置为2999(其他对象在3000处)

  5. 然后将DepthMask着色器添加到球体

而已。有任何问题让我知道!


2
D'oh,我在上面的帖子中完全考虑了这个问题(我实际上是在考虑墙壁/地板上的平孔网格)。链接的解决方案显示了一个3D孔对象,在这种情况下,显示的解决方案非常简单-您实际要做的就是将“孔”写到z缓冲区中而不写任何颜色,并确保该孔是提早。
bluescrn 2014年

@bluescrn不用担心!我感谢详细的帖子。:)
CalebHC 2014年

2

几个选项可以达到您想要的效果-但它们确实要付出一定的代价:

  • 将孔写入模具缓冲区或目标Alpha通道,然后使用合适的模具测试或Alpha混合并且没有z检验,最后绘制天空盒。

要么

  • 在帧开始时将天空盒渲染为纹理,然后将其投影到“孔几何体”上

我怀疑也必须通过使用/滥用z缓冲区来做到这一点-但您可能想使用其真实Z对“孔多边形”进行z测试,然后编写一个不同的Z。您可能使用多次通过和模具缓冲区-使用如下设置的renderstate绘制孔3次:

  • 通过1:无z测试,在孔多边形下清除模具
  • 通过2:正常z测试,模板增量值(通过深度测试的位置)
  • 第3步:在模板> 0的地方清除Z

您仍然需要按照特定的顺序进行绘制-尽管先绘制环境,然后绘制孔,最后绘制天空盒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.