【发布时间】:2022-01-07 08:52:25
【问题描述】:
我正在尝试制作具有视野的 2D 自上而下游戏。
我的视野由 fov 的 2D 网格显示,无法穿过墙壁。
我需要能够将一些对象(例如敌人)放置在仅在视锥内时才会渲染的图层中。
我正在关注this 教程,但找不到 18:16 显示的覆盖设置(我相信这是因为 LWRP 在 Unity 中不再存在)。是否有任何替代方案或其他解决方案?
【问题讨论】:
我正在尝试制作具有视野的 2D 自上而下游戏。
我的视野由 fov 的 2D 网格显示,无法穿过墙壁。
我需要能够将一些对象(例如敌人)放置在仅在视锥内时才会渲染的图层中。
我正在关注this 教程,但找不到 18:16 显示的覆盖设置(我相信这是因为 LWRP 在 Unity 中不再存在)。是否有任何替代方案或其他解决方案?
【问题讨论】:
您的教程中使用的解决方案是让着色器使用模板缓冲区仅显示位于您的 FOV 网格内的部分敌人。
这个解决方案在任何渲染管道中都是很有可能的
希望有所帮助;)
【讨论】:
使用逐层渲染通道和模板缓冲区的概念在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。
【讨论】:
如果您使用的是 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
【讨论】:
如果您想从头开始实现它并使用 BUILT-IN RENDER PIPELINE,您可以继续阅读:
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。它看起来像一个黑白面具:
【讨论】: