Unity3D - 用于视线实现的2D静态战争雾

时间:2017-06-07 14:28:10

标签: c# unity3d shader

Unity初学者在这里!

所以我试图为我的游戏获得一些静态的战争雾/视线。

目前我有2台摄像头:

  • 第一个呈现场景。
  • 第二个具有黑色背景和白色多边形,代表视线。

第一台相机首先渲染,到目前为止一切正常。 (图层设置正确,以便第二台摄像机只有视线多边形)

然后我不想通过将相机的所有白色像素设置为透明来对第二台相机进行一些后期处理,但这就是我丢失的地方。

使用该代码应用着色器:

void OnRenderImage(RenderTexture src, RenderTexture dest)
{
    Graphics.Blit(src, dest, shader);
}

问题在于,当我在第二台相机上应用着色器(在第二台相机上使用depthOnly标志进行测试)时,着色器还会修改第一台相机的renderTexture。在着色器应用之前,看起来相机的渲染纹理会被合并。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

您应该使用着色器。 OnRenderImage需要将数据传输回CPU并在那里线性处理(慢!!! 1 ),而不是在GPU上并行处理。

这需要一些研究才能正确完成,但这个概念非常简单。您需要使用stencil mask来获得所需的效果。 "白色多边形"你已经将数据(字面上设置为1而不是0)写入模板掩码,然后渲染场景的其余部分,但,其中模板掩码为1。

基本上将视线多边形视为告诉相机允许绘制其他内容的位置。这是mask的内容。 stencil mask只是在渲染过程中可用的特定位组,它们不是绘制到屏幕上的数据,而是在渲染过程中保持不变。所以:

传递1:将LOS对象绘制到遮罩缓冲区。
传递2:仅渲染缓冲区的场景。

我写了一个使用模板蒙版的outline shader,您可以将其用作示例并开始使用。请注意,该着色器仅适用于单个对象(以及"创建"新几何体),但同样的过程仍然可以用于做你正在尝试的事情(我只是避难所'我试图自己做。)

看起来this thread有一个(部分)着色器,它具有您正在寻找的效果。

  

我创建了两个标准事件的着色器并修改如下:隐藏着色器:在自动生成的着色器线下" LOD 200",添加:

 Stencil {
 Ref 1
 Comp Equal
 }
     

Portal Shader:在自动生成" LOD 200"下,添加:

 ZWrite Off
 ColorMask 0

 Pass {
     Stencil {
         Ref 1
         Comp always
         Pass replace
     }
 }
     

这与我上面讨论过的概念基本相同。

<强> 另外...

  1. 将LOS渲染为单独的相机,将黑白图像渲染为渲染纹理
  2. 将此渲染纹理应用于场景上方的平面
  3. 将自定义着色器应用于此平面,将黑白转换为黑色透明。执行此操作的片段着色器将非常容易编写。您只需修改返回纹理颜色的部分,即将红色通道的值作为输出Alpha值返回。
  4. 1 我最近做了一个图像效果,我无法弄清楚如何转换为可以管道进入Blit函数的着色器,最终结果以每秒15帧的速度运行即使在中等分辨率(1024x768)并且崩溃快乐。让编译的可执行文件运行时间超过45秒是一场赌博,所以我不建议遵循这条路径。它在编辑器中似乎没问题,但是当你构建它以供分发时,你会得到一个惊喜。