【问题标题】:Unity only render objects from a layer inside a 2D meshUnity 仅从 2D 网格内的图层渲染对象
【发布时间】:2022-01-07 08:52:25
【问题描述】:

我正在尝试制作具有视野的 2D 自上而下游戏。

我的视野由 fov 的 2D 网格显示,无法穿过墙壁。

我需要能够将一些对象(例如敌人)放置在仅在视锥内时才会渲染的图层中。

我正在关注this 教程,但找不到 18:16 显示的覆盖设置(我相信这是因为 LWRP 在 Unity 中不再存在)。是否有任何替代方案或其他解决方案?

【问题讨论】:

    标签: unity3d rendering


    【解决方案1】:

    您的教程中使用的解决方案是让着色器使用模板缓冲区仅显示位于您的 FOV 网格内的部分敌人。

    这个解决方案在任何渲染管道中都是很有可能的

    希望有所帮助;)

    【讨论】:

      【解决方案2】:

      使用逐层渲染通道和模板缓冲区的概念在URP(LWRP 的替代品)中也基本相同。

      配置它的资源默认应该在

       Assets/UniversalRenderPipelineAsset_Renderer
      

      另见See Through Objects with Stencil Buffers using Unity URP,它解释得很好。


      或者,如果您使用内置渲染管道,您将需要通过 Stencil 传递或子着色器直接实现此功能的着色器。


      作为替代方案,您也可以使用DepthTexture。有关使用它和 ShaderGraph 的一些示例,请查看 Creating Overlap Shader Effects, Such as Underwater and Night Vision, in Unity's Shader Graph

      【讨论】:

        【解决方案3】:

        如果您使用的是 2019.3 URP 或更高版本,则需要将 FieldOfView 着色器类型更改为 Universal Render Pipeline/Simple Lit。它具有与视频中的着色器相同的渲染面功能。 https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.1/manual/simple-lit-shader.html

        【讨论】:

          【解决方案4】:

          如果您想从头开始实现它并使用 BUILT-IN RENDER PIPELINE,您可以继续阅读:

          假设这是场景,白色平面是 fov,立方体是敌人:

          fov 可以有一个简单的着色器。非常简单的着色器。例如:

          Shader "Unlit/simple_shader"
          {
              Properties
              {
              }
              SubShader
              {
                  Tags { "RenderType"="Opaque" }
          
                  Pass
                  {
                      CGPROGRAM
                      #pragma vertex vert
                      #pragma fragment frag
          
                      #include "UnityCG.cginc"
          
                      struct appdata
                      {
                          float4 vertex : POSITION;
                          float2 uv : TEXCOORD0;
                      };
          
                      struct v2f
                      {
                          float2 uv : TEXCOORD0;
                          float4 vertex : SV_POSITION;
                      };
          
                      sampler2D _MainTex;
                      float4 _MainTex_ST;
          
                      v2f vert (appdata v)
                      {
                          v2f o;
                          o.vertex = UnityObjectToClipPos(v.vertex);
                          o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                          return o;
                      }
          
                      fixed4 frag (v2f i) : SV_Target
                      {
                          return 1;
                      }
                      ENDCG
                  }
              }
          }
          
          

          然后您将需要一个单独的相机来仅渲染 fov 网格并将其保存为图像,我们将其称为 RenderTexture。它看起来像一个黑白面具:

          然后制作另一个只渲染敌人的相机层:

          然后将生成的掩码添加到它:

          然后把它放在主摄像头的顶部:

          【讨论】:

            猜你喜欢
            • 2018-12-01
            • 2019-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-10
            • 2019-01-14
            相关资源
            最近更新 更多