为什么我的着色器会以某个角度停止渲染?

时间:2017-03-21 10:34:31

标签: unity3d 2d shader

我试图让一个漂亮的森林成为我正在努力的新游戏。 但是我的着色器渲染存在问题。我现在设置它使用2d-sprite渲染器渲染树。而其他不够接近的树将使用着色器进行渲染。但问题在于使用着色器的树。因为当我看着它们并向上移动相机时它们就会停止渲染......为什么?

这是我的意思的gif https://gyazo.com/64acbf5cadd9a89b0ba2cd5f123605ce

这是我的着色器脚本。

Shader "Custom/Tree_Billboard"
{
Properties
{
    [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
_Color("Tint", Color) = (1,1,1,1)
    //_Time ("Time", Float) = 0
    [MaterialToggle] PixelSnap("Pixel snap", Float) = 0
}

    SubShader
{
    Tags
{
    "Queue" = "Transparent"
    "DisableBatching" = "True"
    "SortingLayer" = "Resources_Sprites"
    "IgnoreProjector" = "True"
    "RenderType" = "Transparent"
    "PreviewType" = "Plane"
    "CanUseSpriteAtlas" = "True"
}

    Cull Off
    Lighting Off
    ZWrite Off
    Blend One OneMinusSrcAlpha

    Pass
{
    CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#pragma multi_compile _ PIXELSNAP_ON
#pragma multi_compile _ ETC1_EXTERNAL_ALPHA
#include "UnityCG.cginc"

    //            uniform Float _Time;

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
};

fixed4 _Color;

v2f vert(appdata_t IN)
{
    v2f OUT;
    UNITY_SETUP_INSTANCE_ID(IN);
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
    //                OUT.vertex = UnityObjectToClipPos(IN.vertex);
    OUT.texcoord = IN.texcoord;
    OUT.color = IN.color * _Color;
    //    #ifdef PIXELSNAP_ON

    OUT.vertex = mul(UNITY_MATRIX_P,
        mul(UNITY_MATRIX_MV, float4(0.0, 4.1, 0.0, 1.0))
        - float4(IN.vertex.x, -IN.vertex.y, 0.0, 0.0)
        * float4(6.0, 8.0, 1.0, 1.0));

    //                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
    // get the color from an external texture (usecase: Alpha support for           ETC1 on android)
    color.a = tex2D(_AlphaTex, uv).r;
#endif //ETC1_EXTERNAL_ALPHA

    return color;
}

fixed4 frag(v2f IN) : SV_Target
{
    fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
c.rgb *= c.a;
return c;
}
    ENDCG
}
}
}

2 个答案:

答案 0 :(得分:0)

以下是“jvo3dc”在Unity论坛上所说的内容

“对象被剔除。剔除是在对象的边界框上完成的。 您正在调整着色器中的顶点,使它们落在原始边界框之外。这意味着剔除过程有时可以假设它们是不可见的,而它们实际上是可见的。 解决方案是将边界框与顶点着色器中的实际最大位移进行匹配。“

所以我去谷歌搜索并找到了解决方案。我创建了一个新的quad-gameObject。添加了一个新脚本并将其添加到Start()方法中,似乎已修复它。

transform.GetChild(0).GetComponent<MeshFilter>().sharedMesh.bounds = new Bounds(new Vector3(0, 0, 0), new Vector3(1, 1,1) * 10.0f);

Here's the Unity forum post

答案 1 :(得分:0)

这显然不是着色器问题,而是剪裁平面的问题。首先检查相机设置。 enter image description here