UnityShader初级篇——渐变纹理

来源:互联网 发布:反转二叉树 js 编辑:程序博客网 时间:2024/06/05 03:28

1.使用渐变纹理来控制漫反射光照的结果

Shader"Unity Shaders Book/Chapter 7/Ramp Texture"{Properties{_Color ("Color Tint", Color) = (1,1,1,1)//"White是内置纹理名字,即全白纹理,{}是初始值"_RampTex("Ramp Text", 2D) = "white" {}_Specular ("Specular", Color) = (1,1,1,1)_Gloss ("Gloss", Range(8.0, 256)) = 20 }SubShader{Pass{        Tags{"LightMode" = "ForwardBase"}                        CGPROGRAM#pragma vertex vert#pragma fragment frag#include "LIghting.cginc"fixed4 _Color;sampler2D _RampTex;//定义_RampTex的纹理属性变量float4 _RampTex_ST;fixed4 _Specular;float _Gloss;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct v2f{        float4 pos : SV_POSITION;        float3 worldNormal : TEXCOORD0;        float3 worldPos : TEXCOORD1;        float2 uv : TEXCOORD2;};v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;//使用内置宏TRANSFORM_TEX(顶点纹理坐标,纹理名)计算经过平铺和偏移后的纹理坐标o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz ;//使用半兰伯特模型构建一个纹理坐标,使用此坐标对渐变纹理进行采样,uv方向都使用半兰博特,最后将渐变纹理与材质纹理相乘fixed halfLambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb * _Color.rgb;fixed3 diffuse = _LightColor0.rgb * diffuseColor;fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 halfDir = normalize(worldLightDir + viewDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal,halfDir)), _Gloss);return fixed4(ambient + diffuse + specular,1.0);;}ENDCG}}Fallback"Specular"}



阅读全文
0 0
原创粉丝点击