【问题标题】:Unity3D - 2D static fog of war for line of sight implementationUnity3D - 用于视线实施的 2D 静态战争迷雾
【发布时间】:2017-11-08 23:21:40
【问题描述】:

Unity 初学者在这里!

所以我正在尝试为我的游戏设置一些静态的战争迷雾/视线。

目前我有 2 个摄像头:

  • 第一个渲染场景。
  • 第二个有黑色背景和代表视线的白色多边形。

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

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

使用该代码应用着色器:

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

问题是,当我在第二个摄像头上应用着色器(在第二个摄像头上使用 depthOnly 标志测试)时,着色器还会修改第一个摄像头的渲染纹理。看起来相机的渲染纹理是在着色器应用之前组合在一起的。

我在这里错过了什么?

【问题讨论】:

    标签: c# unity3d shader


    【解决方案1】:

    您应该为此使用着色器。 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 值返回。

    1我最近做了一个图像效果,我不知道如何转换为可以通过管道传输到 Blit 函数的着色器,最终结果以每秒 15 帧的速度运行,即使在中等 分辨率 (1024x768) 并且是崩溃的快乐。让编译后的可执行文件运行超过大约 45 秒是一场赌博,所以我不建议走这条路。它在编辑器中看起来不错,但是当您构建它以进行分发时,您会感到惊讶。

    【讨论】:

    • 能不能模糊战争迷雾?
    • @Ploppy 您有几个选项,具体取决于所需效果的确切性质。如果您想要径向衰减衰减,可以在第二次通过时计算并根据与中心的距离将输出颜色缩放为黑色。
    • 好的,谢谢,我创建了 2 个标准表面着色器,将第一个应用于材质并将材质应用于我的 LOS 多边形,第二个使用 OnRenderImage 中的 Graphics.Blit 方法应用于相机称呼。首先,我的多边形在场景中不再可见,这很正常,我猜。第二,最终结果不变。你有什么想法吗?
    • @Ploppy 我的回答根本不使用 Blit。所以我不知道哪里出了问题。
    • 对不起,正如我所说,我是初学者,对我来说还不清楚。所以我有两个问题,我对第一个着色器做对了吗?我应该在哪里/如何应用第二个着色器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多