2017-03-21 1 views
1

私は新しいゲームに取り組んでいて、すてきな森を作ろうとしています。 しかし、私のシェーダのレンダリングには問題があります。私は現在、2dスプライトレンダラを使ってツリーでレンダリングするようにセットアップしました。そして、それほど近くにない他のツリーは、代わりにシェーダを使用してレンダリングされます。しかし、問題は、シェーダを使用しているツリーです。私がそれらを見て、カメラを動かすと、ただレンダリングが止まります。なぜですか?シェーダが特定の角度でレンダリングを停止するのはなぜですか?

ここには、私が意味する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 
} 
} 
} 
+0

アングルの問題ではなく、遠くのクリッププレーンの問題だと思われます。 – Hellium

+0

私はそれを試しました..しかし、私はそれを働かせるように見えません。他のアイデア? – TheSand

+0

あなたの投影行列に問題があるようです。 – Nain

答えて

0

は、ここで「jvo3dcは」錐台カリング。カリングは、オブジェクトのバウンディングボックスで行われますユニティフォーラムの

」のオブジェクトにしたものです。 あなたがで頂点を調整していますシェーダが元のバウンディングボックスの外に来るようにすることができます。つまり、カリングプロセスでは、実際に表示されている間は非表示と見なすことがあります。 解決策は、バウンディングボックスを頂点シェーダの実際の最大変位に一致させることです。

Googleで検索して解決策を見つけました。私は新しい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

0

これは明らかに、シェーダの問題が、あなたのクリップ面の問題ではありません。カメラの設定を最初に確認してください。 enter image description here

関連する問題