2017-03-21 1 views
1

J'essaie de faire une belle forêt à un nouveau jeu sur lequel je travaille. Mais theres un problème avec le rendu de mes shaders. Je l'ai actuellement configuré pour rendre proche par les arbres avec un moteur de rendu 2d-sprite. Et les autres arbres qui ne sont pas suffisamment proches seront rendus à l'aide du shader. Mais le problème est avec les arbres qui utilisent le shader. Parce que quand je les regarde et que je bouge ma caméra, ils arrêtent juste le rendu. Pourquoi?Pourquoi mes shaders arrêtent-ils le rendu sous un certain angle?

Voici un gif de ce que je veux dire.
https://gyazo.com/64acbf5cadd9a89b0ba2cd5f123605ce

Et voici mon script shader.

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

Il semble que c'est un problème de plan de loin lointain plutôt qu'un problème d'angle. – Hellium

+0

J'ai tryd ça .. mais je n'arrive pas à le faire fonctionner. D'autres idées? – TheSand

+0

Cela semble être un problème avec votre matrice de projection. – Nain

Répondre

0

Voici ce que « jvo3dc » dit sur le forum Unity

« Les objets seront abattus frustum. L'abattage se fait sur la zone de délimitation de l'objet. Vous vous adaptez les sommets dans la shader pour qu'ils tombent à l'extérieur de la boîte de délimitation originale, ce qui signifie que le processus de sélection peut parfois supposer qu'ils sont invisibles, alors qu'ils sont visibles La solution consiste à faire correspondre le cadre de délimitation avec le déplacement maximum réel dans le vertex shader.

Alors je suis allé chercher un peu sur Google et j'ai trouvé une solution. J'ai créé un nouveau quad-gameObject. Ajout d'un nouveau script et ajout de ceci à la méthode Start() et cela semble l'avoir corrigé.

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

Ceci est clairement pas un problème de shaders, mais un problème avec votre plan de clipping. Vérifiez d'abord les paramètres de votre appareil photo. enter image description here