这个水着色器的哪些部分负责透明度?

Which parts of this water shader are resposible for the transparancy?

我这里有一个水着色器,我想知道什么代码负责透明度。

目前水是透明的,这是我想改变的另一件事。我希望 RenderType 是 "RenderType"="transparent" 但它是 "RenderType"="Opaque" ....我在这个着色器中找不到透明代码。

也许您知道导致透明度的部分代码?

这是水着色器

Shader "FX/Water" {
 Properties {
     _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.063
     _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.44
     _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.40
     _RefrColor ("Refraction color", COLOR)  = ( .34, .85, .92, 1)
     [NoScaleOffset] _Fresnel ("Fresnel (A) ", 2D) = "gray" {}
     [NoScaleOffset] _BumpMap ("Normalmap ", 2D) = "bump" {}
     WaveSpeed ("Wave speed (map1 x,y; map2 x,y)", Vector) = (19,9,-16,-7)
     [NoScaleOffset] _ReflectiveColor ("Reflective color (RGB) fresnel (A)", 2D) = "" {}
     _HorizonColor ("Simple water horizon color", COLOR)  = ( .172, .463, .435, 1)
     [HideInInspector] _ReflectionTex ("Internal Reflection", 2D) = "" {}
     [HideInInspector] _RefractionTex ("Internal Refraction", 2D) = "" {}

     //
     _EmissionColor("Color", Color) = (0.000000,0.000000,0.000000,1.000000)
     _EmissionMap("Emission", 2D) = "white" { }
     [Toggle] _DynamicEmissionLM("Dynamic Emission (Lightmapper)", Int) = 0
 }


 // -----------------------------------------------------------
 // Fragment program cards


 Subshader {
     Tags { "WaterMode"="Refractive" "RenderType"="Opaque" }
     Pass {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #pragma multi_compile_fog
 #pragma multi_compile WATER_REFRACTIVE WATER_REFLECTIVE WATER_SIMPLE

 #if defined (WATER_REFLECTIVE) || defined (WATER_REFRACTIVE)
 #define HAS_REFLECTION 1
 #endif
 #if defined (WATER_REFRACTIVE)
 #define HAS_REFRACTION 1
 #endif


 #include "UnityCG.cginc"

 uniform float4 _WaveScale4;
 uniform float4 _WaveOffset;

 #if HAS_REFLECTION
 uniform float _ReflDistort;
 #endif
 #if HAS_REFRACTION
 uniform float _RefrDistort;
 #endif

 struct appdata {
     float4 vertex : POSITION;
     float3 normal : NORMAL;
 };

 struct v2f {
     float4 pos : SV_POSITION;
     #if defined(HAS_REFLECTION) || defined(HAS_REFRACTION)
         float4 ref : TEXCOORD0;
         float2 bumpuv0 : TEXCOORD1;
         float2 bumpuv1 : TEXCOORD2;
         float3 viewDir : TEXCOORD3;
     #else
        float2 bumpuv0 : TEXCOORD0;
         float2 bumpuv1 : TEXCOORD1;
         float3 viewDir : TEXCOORD2;
     #endif
     UNITY_FOG_COORDS(4)
 };

 v2f vert(appdata v)
 {
     v2f o;
     o.pos = UnityObjectToClipPos(v.vertex);


     // scroll bump waves
     float4 temp;
     float4 wpos = mul (unity_ObjectToWorld, v.vertex);
     //temp.xyzw = wpos.xzxz * _WaveScale4 + _WaveOffset;
     temp.xyzw = wpos.yzyz * _WaveScale4 + _WaveOffset;
     o.bumpuv0 = temp.xy;
     o.bumpuv1 = temp.wz;

     // object space view direction (will normalize per pixel)
     o.viewDir.xzy = WorldSpaceViewDir(v.vertex);

     #if defined(HAS_REFLECTION) || defined(HAS_REFRACTION)
     o.ref = ComputeNonStereoScreenPos(o.pos);
     #endif

     UNITY_TRANSFER_FOG(o,o.pos);
     return o;
 }

 #if defined (WATER_REFLECTIVE) || defined (WATER_REFRACTIVE)
 sampler2D _ReflectionTex;
 #endif
 #if defined (WATER_REFLECTIVE) || defined (WATER_SIMPLE)
 sampler2D _ReflectiveColor;
 #endif
 #if defined (WATER_REFRACTIVE)
 sampler2D _Fresnel;
 sampler2D _RefractionTex;
 uniform float4 _RefrColor;
 #endif
 #if defined (WATER_SIMPLE)
 uniform float4 _HorizonColor;
 #endif
 sampler2D _BumpMap;

 half4 frag( v2f i ) : SV_Target
 {
     i.viewDir = normalize(i.viewDir);

     // combine two scrolling bumpmaps into one
     half3 bump1 = UnpackNormal(tex2D( _BumpMap, i.bumpuv0 )).rgb;
     half3 bump2 = UnpackNormal(tex2D( _BumpMap, i.bumpuv1 )).rgb;
     half3 bump = (bump1 + bump2) * 0.5;

     // fresnel factor
     half fresnelFac = dot( i.viewDir, bump );

     // perturb reflection/refraction UVs by bumpmap, and lookup colors

     #if HAS_REFLECTION
     float4 uv1 = i.ref; uv1.xy += bump * _ReflDistort;
     half4 refl = tex2Dproj( _ReflectionTex, UNITY_PROJ_COORD(uv1) );
     #endif
     #if HAS_REFRACTION
     float4 uv2 = i.ref; uv2.xy -= bump * _RefrDistort;
     half4 refr = tex2Dproj( _RefractionTex, UNITY_PROJ_COORD(uv2) ) * _RefrColor;
     #endif

     // final color is between refracted and reflected based on fresnel
     half4 color;

 #if defined(WATER_REFRACTIVE)
     half fresnel = UNITY_SAMPLE_1CHANNEL( _Fresnel,         
      float2(fresnelFac,fresnelFac) );
     color = lerp( refr, refl, fresnel );
     #endif

     #if defined(WATER_REFLECTIVE)
     half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) );
     color.rgb = lerp( water.rgb, refl.rgb, water.a );
     color.a = refl.a * water.a;
     #endif

     #if defined(WATER_SIMPLE)
     half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) );
     color.rgb = lerp( water.rgb, _HorizonColor.rgb, water.a );
     color.a = _HorizonColor.a;
     #endif

     UNITY_APPLY_FOG(i.fogCoord, color);

     //o.Emission = c.rgb * tex2D(_Illum, IN.uv_Illum).a;


     return color;
 }
 ENDCG

     }
 }

 }

#pragma multi_compile WATER_REFRACTIVE WATER_REFLECTIVE WATER_SIMPLE 行允许脚本根据全局配置具有不同的模式。来自文档:

How multi_compile works

Example directive:

#pragma multi_compile FANCY_STUFF_OFF FANCY_STUFF_ON

This example directive produces two shader variants: one with FANCY_STUFF_OFF defined, and another with FANCY_STUFF_ON. At run time, Unity activates one of them based on the Material or global shader keywords. If neither of these two keywords are enabled, then Unity uses the first one (in this example, FANCY_STUFF_OFF).

所以在这个问题的情况下,默认启用WATER_REFRACTIVE

如果你查看片段着色器,你会看到这个 #ifdefined 部分:

#if defined(WATER_REFRACTIVE)
half fresnel = UNITY_SAMPLE_1CHANNEL( _Fresnel,         
float2(fresnelFac,fresnelFac) );
color = lerp( refr, refl, fresnel );
#endif

为了回答您的直接问题,透明效果是折射颜色 refr 在反射颜色 refl 上可见的地方,这由 _Fresnel_BumpMap 纹理。

可以通过将着色器更改为仅使用 color = refl; 来使水完全反射。

然而,另一种方法是通过在水的 Material 上使用 Material.EnableKeyword 来启用 WATER_SIMPLE 关键字来更改着色器的模式:

water.material.EnableKeyword("WATER_SIMPLE"); 

这样做将在顶点着色器中使用这个 #ifdefined 部分,而不是前面提到的部分:

#if defined(WATER_SIMPLE)
half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) );
color.rgb = lerp( water.rgb, _HorizonColor.rgb, water.a );
color.a = _HorizonColor.a;
#endif

我们可以看到它将输出颜色的 alpha 设置为 _HorizonColor.a。这意味着使用此模式,您可以通过更改 _HorizonColor

的 alpha 直接设置水的透明度