2017-06-30 3 views
1

Unityでシェーダーを書く方法を学び、カラーとアルファ値を分離して他のテクスチャ(またはレイヤー)に影響を与えないようにしています。Unity Shader:他のレイヤーに影響を与えないテクスチャレイヤーを作成するのに助けが必要です

私のシェイダーでは、文字の3つのテクスチャがあります(背景はそれぞれのテクスチャ設定で透明になっています)。

私は背景色を持ちたいと思っています。背景の上に3つのテクスチャ/レイヤーが必要で、背景や他のレイヤーに影響を与えずに各レイヤーの色合いとアルファ値を変更することができます。

も...

私はサーフィン機能でテクスチャで色を掛け、テクスチャ色合いの変化だけでなく、透明な背景を行います。トランスペアレントな背景色合いが透明なときに変化するのはなぜですか?

Properties{ 
    _Background("BackroundColor", Color) = (1,1,1,1) 
    _Color("c1", Color) = (1,1,1,1) 
    _Color2("c2", Color) = (1,1,1,1) 
    _Color3("c3", Color) = (1,1,1,1) 
    _MainTex ("layer1", 2D) = "white" {} 
    _MainTex2 ("layer2", 2D) = "white" {} 
    _MainTex3 ("layer3", 2D) = "white" {} 
} 

SubShader { 
    Tags { "RenderType"="Opaque"} 

     CGPROGRAM 
     #pragma surface surf Lambert alpha 
     #pragma target 3.0 

     struct Input { 
      float2 uv_MainTex; 
      float2 uv2_MainTex2; 
      float2 uv3_MainTex3; 
     }; 

     sampler2D _MainTex; 
     sampler2D _MainTex2; 
     sampler2D _MainTex3; 
     float4 _Background; 
     float4 _Color; 
     float4 _Color2; 
     float4 _Color3; 

     void surf (Input IN, inout SurfaceOutput o) { 
      o.Albedo = _Background * (tex2D (_MainTex, IN.uv_MainTex).rgb*_Color) * (tex2D (_MainTex2, IN.uv2_MainTex2).rgb*_Color2) * (tex2D (_MainTex3, IN.uv3_MainTex3).rgb*_Color3); 

      o.Alpha = _Color.a * _Color2.a * _Color3.a; 

     } 
     ENDCG 
} 
Fallback "Diffuse" 
+0

色の値は、あなたが望むものではありません。特に、すべてのアルファ値を最後に掛け合わせることによって!それらのどれかが0の場合は、何も描画しません!**あなたが望む数学を理解するには、https://www.khronos.org/opengl/wiki/Blendingを参照してください。 – Draco18s

答えて

1

団結とシェーダを開始するニースの事;)

だからここにあなたの問題に私の解決策があるが、あなたは2つのさらさテクスチャを持っています。一つは、バックグラウンドである(MainTex)と1つは、あなたの手紙(オーバーレイ)の一つであり、あなたは、これが役立つ変数Ratio_

Shader "Custom/Overlay" { 
Properties { 
    _Color ("Color", Color) = (1,1,1,1) 
    _MainTex ("Main Texture", 2D) = "white" {} 
    _Overlay ("Overlay Texture", 2D) = "white" {} // One texture of letter 
    _Ratio("Ratio", Range(0,1)) = 1 
} 
SubShader { 
    Tags { "RenderType"="Opaque" } 
    LOD 200 
    Blend SrcAlpha OneMinusSrcAlpha 
    Lighting On 
CGPROGRAM 

#pragma surface surf Standard fullforwardshadows 

#pragma target 3.0 

sampler2D _MainTex; 
sampler2D _Overlay; 
float _Ratio; 
struct Input { 
    float2 uv_MainTex; 
    float2 uv_Overlay; 
}; 

fixed4 _Color; 

void surf (Input IN, inout SurfaceOutputStandard o) { 
    // Albedo comes from a texture tinted by color 
    fixed4 background = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
    fixed4 finalFragment = tex2D (_Overlay, IN.uv_Overlay) * _Color; 
    o.Albedo = background.rgb * (1 -finalFragment.a*_Ratio) + finalFragment.rgb * _Ratio; 
    o.Alpha = background.a; 
} 
ENDCG 
}FallBack "Diffuse" 

} 

希望とオーバーレイのアルファを混在させることができます:あなたが乗算しているD

関連する問題