【发布时间】:2019-01-14 08:21:19
【问题描述】:
我正在制作一个结合了 2d 和 3d 元素的等距游戏。我想知道如何让我的玩家和敌人精灵(全部由 2d 元素组成)不会渲染在我的 3d 元素后面或内部。
所以我尝试使用 renderQueue 并将这些岩石等材质的渲染队列设置为较高的值,以便将它们绘制在 2d 元素后面。
但是通过我的搜索,我发现我实际上需要设置对象的 ztest 来纠正这个问题。这让我有点困惑,我不确定该怎么做,因为我并没有真正使用过那么多着色器。我找不到任何体面的参考资料来准确解释如何处理这些假设有this 等先验知识的东西。我尝试下载统一着色器并打开默认精灵之一,但我不确定在哪里更改 ztest 或标记来解决这个问题。
这里是统一的标准精灵着色器:
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
#ifndef UNITY_SPRITES_INCLUDED
#define UNITY_SPRITES_INCLUDED
#include "UnityCG.cginc"
#ifdef UNITY_INSTANCING_ENABLED
UNITY_INSTANCING_BUFFER_START(PerDrawSprite)
// SpriteRenderer.Color while Non-Batched/Instanced.
UNITY_DEFINE_INSTANCED_PROP(fixed4, unity_SpriteRendererColorArray)
// this could be smaller but that's how bit each entry is regardless of type
UNITY_DEFINE_INSTANCED_PROP(fixed2, unity_SpriteFlipArray)
UNITY_INSTANCING_BUFFER_END(PerDrawSprite)
#define _RendererColor UNITY_ACCESS_INSTANCED_PROP(PerDrawSprite, unity_SpriteRendererColorArray)
#define _Flip UNITY_ACCESS_INSTANCED_PROP(PerDrawSprite, unity_SpriteFlipArray)
#endif // instancing
CBUFFER_START(UnityPerDrawSprite)
#ifndef UNITY_INSTANCING_ENABLED
fixed4 _RendererColor;
fixed2 _Flip;
#endif
float _EnableExternalAlpha;
CBUFFER_END
// Material Color.
fixed4 _Color;
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_OUTPUT_STEREO
};
inline float4 UnityFlipSprite(in float3 pos, in fixed2 flip)
{
return float4(pos.xy * flip, pos.z, 1.0);
}
v2f SpriteVert(appdata_t IN)
{
v2f OUT;
UNITY_SETUP_INSTANCE_ID (IN);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
OUT.vertex = UnityFlipSprite(IN.vertex, _Flip);
OUT.vertex = UnityObjectToClipPos(OUT.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color * _Color * _RendererColor;
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap (OUT.vertex);
#endif
return OUT;
}
sampler2D _MainTex;
sampler2D _AlphaTex;
fixed4 SampleSpriteTexture (float2 uv)
{
fixed4 color = tex2D (_MainTex, uv);
#if ETC1_EXTERNAL_ALPHA
fixed4 alpha = tex2D (_AlphaTex, uv);
color.a = lerp (color.a, alpha.r, _EnableExternalAlpha);
#endif
return color;
}
fixed4 SpriteFrag(v2f IN) : SV_Target
{
fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
c.rgb *= c.a;
return c;
}
#endif // UNITY_SPRITES_INCLUDED
更新 1
【问题讨论】:
-
您是否尝试过将 2D 元素定位在 3D 空间中,就像您的 3D 元素一样,将它们的变换位置放在前面/后面,无论它们需要在前面/后面吗?
-
就我而言,这不是一个好主意。因为我的相机是等距的,所以它以 41 度角俯视世界。将 2d 元素放置在 3 个元素的“前面”意味着它们被放置在奇怪的角度,这使得 2d 元素的瞄准系统和位置都发生了倾斜,并且使用起来确实变得混乱。我很确定这样做的正确方法是能够告诉某些 3D 元素它们应该简单地呈现在 2D 元素后面。我只是不知道如何编写一个这样做的着色器。更新 1 说明了它在游戏中的外观。 Sprite 在 tile 前面渲染,但不渲染岩石。
-
你能用别的相机吗?如果可以的话,您可以设置另一个相机剔除遮罩和深度。这可以使图层中的某些内容显示在前面。
-
shader 可以做到这一点,但我认为使用另一个相机会很容易实现。