2017-01-07 6 views
0

У меня есть пользовательский шейдер, который может визуализировать текстуру внутри объекта (например, Shpere). Но я не могу его прозрачно, потому что единство говорит, что в этом шейдере не добавлено свойство _Color. Я не эксперт в Unity Shader, поэтому мне нужна помощь в прозрачности моего существующего шейдера. Вот мой шейдерный код.Как прозрачный пользовательский шейдер Unity3D?

Shader "InsideVisible" { 
Properties { 
_MainTex ("Base (RGB)", 2D) = "white" {} 
} 

SubShader { 
Tags { "RenderType"="Opaque" } 
Cull front // ADDED BY BERNIE, TO FLIP THE SURFACES 
LOD 100 

Pass { 
    CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 

     #include "UnityCG.cginc" 

     struct appdata_t { 
      float4 vertex : POSITION; 
      float2 texcoord : TEXCOORD0; 
     }; 

     struct v2f { 
      float4 vertex : SV_POSITION; 
      half2 texcoord : TEXCOORD0; 
     }; 

     sampler2D _MainTex; 
     float4 _MainTex_ST; 

     v2f vert (appdata_t v) 
     { 
      v2f o; 
      o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
      // ADDED BY BERNIE: 
      v.texcoord.x = 1 - v.texcoord.x;     
      o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 
      return o; 
     } 

     fixed4 frag (v2f i) : SV_Target 
     { 
      fixed4 col = tex2D(_MainTex, i.texcoord); 
      return col; 
     } 
    ENDCG 
} 
} 

} 
+0

Шейдер, как указано, работает правильно, когда применяется в Unity. Возможно, вы пытаетесь получить доступ к свойству '_Color' из сценария или чего-то еще? – Jephron

+0

Да. Я пытаюсь сделать его прозрачным с помощью скрипта. Обычный стандартный шейдер становится прозрачным, но этот пользовательский шейдер не работает. В противном случае этот шейдер работает отлично. – XpressGeek

ответ

1

Ваш сценарий, вероятно, пытается получить доступ к свойству с именем _Color установить его значение альфа, но нет _Color собственности на шейдере, поэтому сценарий не удается.

Также шейдер не настроен для визуализации прозрачности, поэтому нам нужно это исправить.

Свойства Shader похожи на общедоступные свойства, которые вы открываете на классах C#: внешний мир может манипулировать ими, чтобы изменить способ визуализации шейдеров.

Во фрагменте мы умножаем цвет изображения на свойство _Color, чтобы он мог контролировать оттенок и альфу.

Чтобы сделать прозрачность вашего шейдера прозрачным, вам также нужно добавить несколько строк в SubShader и прагму.

Shader "InsideVisible" { 
    Properties { 
     _MainTex ("Base (RGB)", 2D) = "white" {} 
     _Color ("Color (RGBA)", Color) = (1, 1, 1, 1) // add _Color property 
    } 

    SubShader { 
     Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} 
     ZWrite Off 
     Blend SrcAlpha OneMinusSrcAlpha 
     Cull front // ADDED BY BERNIE, TO FLIP THE SURFACES 
     LOD 100 

     Pass { 
      CGPROGRAM 

       #pragma vertex vert alpha 
       #pragma fragment frag alpha 

       #include "UnityCG.cginc" 

       struct appdata_t { 
        float4 vertex : POSITION; 
        float2 texcoord : TEXCOORD0; 
       }; 

       struct v2f { 
        float4 vertex : SV_POSITION; 
        half2 texcoord : TEXCOORD0; 
       }; 

       sampler2D _MainTex; 
       float4 _MainTex_ST; 
       float4 _Color; 

       v2f vert (appdata_t v) 
       { 
        v2f o; 
        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
        // ADDED BY BERNIE: 
        v.texcoord.x = 1 - v.texcoord.x; 
        o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 
        return o; 
       } 

       fixed4 frag (v2f i) : SV_Target 
       { 
        fixed4 col = tex2D(_MainTex, i.texcoord) * _Color; // multiply by _Color 
        return col; 
       } 
      ENDCG 
     } 
    } 
} 
+0

, который работает сейчас. Большое спасибо! Это то, что я искал в течение 10 дней! – XpressGeek

+0

Если ответ верный, отметьте его как принятый. – Jephron