Unity3D shader(15)——材质(玻璃)

如有更多问题,请qq254033230咨询。

有了前面的基础,就可以随意用Unity Fragement Shader来实现自己想要的效果。

这里就主要以玻璃为例。

首先实现玻璃的透明的特性;

里面的Tags { "Queue" = "Transparent" }是为了实现透明的效果。Blend SrcAlpha OneMinusSrcAlpha为了显示透明的物体不改变后面的物体的显示效果。最后,颜色是一个思维数组,透明度是颜色的最后一个元素,所以用col[3]来表示透明度。_AlphaVal控制透明度。如果想实现彩色玻璃的效果,只需要改变_MainTint和_AlphaVal的值。

Shader "Custom/FragmentShader" {
properties{
        _MainTint("Main Color", Color) = (1, 1, 1, 1)
        _AlphaVal("Alpha", Range(0, 1)) = 0.1
}
	SubShader {
	    Tags { "Queue" = "Transparent" }

		PASS{

		Blend SrcAlpha OneMinusSrcAlpha
				
		CGPROGRAM
		#pragma vertex vert  
        #pragma fragment frag

        #include "UnityCG.cginc"
        #include "Lighting.cginc"


        float4 _MainTint;
        float _AlphaVal;


        struct v2f{
        float4 pos:POSITION;
        float4 col:texcoord0;
        };  

        v2f vert(appdata_base v){
        v2f o;
        o.pos=UnityObjectToClipPos(v.vertex);
        return o;
        }

        float4 frag(v2f IN):COLOR{
        float4 col;
        col=_LightColor0*_MainTint;
        col[3]*=_AlphaVal;
        return col;
        }
		ENDCG
		}
	}
	FallBack "Diffuse"

}


如果想玻璃效果更逼真,带上漫反射的光,加上环境光,以及自身的颜色的组合。

Shader "Custom/FragmentShader" {
properties{
        _MainTint("Main Color", Color) = (1, 1, 1, 1)
        _AlphaVal("Alpha", Range(0, 1)) = 0.1
}
	SubShader {
	    Tags { "Queue" = "Transparent" }

		PASS{

		Blend SrcAlpha OneMinusSrcAlpha
				
		CGPROGRAM
		#pragma vertex vert  
        #pragma fragment frag

        #include "UnityCG.cginc"
        #include "Lighting.cginc"


        float4 _MainTint;
        float _AlphaVal;


        struct v2f{
        float4 pos:POSITION;
        float3 normal1:texcoord1;
        float4 vertex1:texcoord2;
        float4 col:texcoord0;
        };  

        v2f vert(appdata_base v){
        v2f o;
        o.pos=UnityObjectToClipPos(v.vertex);
        o.normal1=v.normal;
        o.vertex1=v.vertex;
        return o;
        }

        float4 frag(v2f IN):COLOR{
        float4 col= UNITY_LIGHTMODEL_AMBIENT;  
        float3 N=UnityObjectToWorldNormal(IN.normal1);  
        float3 L=normalize(WorldSpaceLightDir(IN.vertex1));  
        float diffuseScale=saturate(dot(N,L));
        col+=_LightColor0*diffuseScale+_MainTint; 
        col[3]*=_AlphaVal;
        return col;
        }
		ENDCG
		}
	}
	FallBack "Diffuse"

}

如果想呈现周围景色,那么需要加上立方体贴图。用上立方体贴图,造成反射的假象。

Shader "Custom/FragmentShader" {
properties{
        _MainTint("Main Color", Color) = (1, 1, 1, 1)
        _AlphaVal("Alpha", Range(0, 1)) = 0.1
        _CubeMap("CubeMap",CUBE)=""{}
}
	SubShader {
	    Tags { "Queue" = "Transparent" }

		PASS{

		Blend SrcAlpha OneMinusSrcAlpha
				
		CGPROGRAM
		#pragma vertex vert  
        #pragma fragment frag

        #include "UnityCG.cginc"
        #include "Lighting.cginc"

        samplerCUBE _CubeMap;
        float4 _MainTint;
        float _AlphaVal;


        struct v2f{
        float4 pos:POSITION;
        float3 normal1:texcoord1;
        float4 vertex1:texcoord2;
        float3 R:texcoord3;
        float4 col:texcoord0;

        };  

        v2f vert(appdata_base v){
        v2f o;
        o.pos=UnityObjectToClipPos(v.vertex);
        o.normal1=v.normal;
        o.vertex1=v.vertex;
        return o;
        }

        float4 frag(v2f IN):COLOR{
        float4 col= UNITY_LIGHTMODEL_AMBIENT;  
        float3 N=UnityObjectToWorldNormal(IN.normal1);  
        float3 L=normalize(WorldSpaceLightDir(IN.vertex1));  
        float diffuseScale=saturate(dot(N,L));
        col+=_LightColor0*diffuseScale+_MainTint;

        float3 N2=normalize(mul(IN.normal1,(float3x3)_World2Object));
        float3 V= -WorldSpaceViewDir(IN.vertex1);
        col+=texCUBE(_CubeMap,reflect(V,N2));

        col[3]*=_AlphaVal;
        return col;
        }
		ENDCG
		}
	}
	FallBack "Diffuse"

}








  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码在文件 Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {} _SpecularTex ("Specular (R) Gloss (G) Anisotropic Mask (B)", 2D) = "gray" {} _BumpMap ("Normal (Normal)", 2D) = "bump" {} _AnisoTex ("Anisotropic Direction (RGB)", 2D) = "bump" {} _AnisoOffset ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2 _Cutoff ("Alpha Cut-Off Threshold", Range(0,1)) = 0.5 } SubShader{ Tags { "RenderType" = "Opaque" } CGPROGRAM struct SurfaceOutputAniso { fixed3 Albedo; fixed3 Normal; fixed4 AnisoDir; fixed3 Emission; half Specular; fixed Gloss; fixed Alpha; }; float _AnisoOffset, _Cutoff; inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten) { fixed3 h = normalize(normalize(lightDir) + normalize(viewDir)); float NdotL = saturate(dot(s.Normal, lightDir)); fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h); float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180))); float spec = saturate(dot(s.Normal, h)); spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), s.Gloss * 128) * s.Specular); fixed4 c; c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * spec)) * (atten * 2); c.a = 1; clip(s.Alpha - _Cutoff); return c; } #pragma surface surf Aniso #pragma target 3.0 struct Input { float2 uv_MainTex; float2 uv_AnisoTex; }; sampler2D _MainTex, _SpecularTex, _BumpMap, _AnisoTex; void surf (Input IN, inout SurfaceOutputAniso o) { fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = albedo.rgb; o.Alpha = albedo.a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex)); fixed3 spec = tex2D(_SpecularTex, IN.uv_MainTex).rgb; o.Specular = spec.r; o.Gloss = spec.g; o.AnisoDir = fixed4(tex2D(_AnisoTex, IN.uv_AnisoTex).rgb, spec.b); } ENDCG } FallBack "Transparent/Cutout/VertexLit" }[/code]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值