内置管线
1 Shader "Unity Shaders Book/Chapter 7/Single Texture" { 2 Properties { 3 _MainTex("MainTex", 2D) = "white"{} 4 _Color("Color Tint", Color) = (1, 1, 1, 1) 5 _Specular("Specular", Color) = (1, 1, 1, 1) 6 _Gloss("Gloss", Range(10, 256)) = 20 7 // _MainTex_ST 它不是属性 8 } 9 10 SubShader { 11 Pass { 12 Tags { 13 "LightMode"="ForwardBase" 14 } 15 16 CGPROGRAM 17 #pragma vertex vert 18 #pragma fragment frag 19 20 #include "UnityCG.cginc" 21 #include "Lighting.cginc" 22 23 sampler2D _MainTex; 24 float4 _MainTex_ST; 25 fixed4 _Color; 26 fixed4 _Specular; 27 float _Gloss; 28 29 struct a2v { 30 float4 vertex : POSITION; 31 float3 normal : NORMAL; 32 float4 texcoord : TEXCOORD0; // unity会将第一组纹理坐标存储到改变量中 33 }; 34 35 struct v2f { 36 float4 pos : SV_POSITION; 37 float3 worldNor : TEXCOORD0; 38 float3 worldPos : TEXCOORD1; 39 float2 uv : TEXCOORD2; // 疑惑,是不是float2类型? 40 }; 41 42 v2f vert(appdata_full data) { 43 v2f v; 44 v.pos = UnityObjectToClipPos(data.vertex); 45 v.worldPos = mul(unity_ObjectToWorld, data.vertex); 46 47 // v.worldNor = mul(data.normal, unity_WorldToObject); 48 v.worldNor = UnityObjectToWorldNormal(data.normal); 49 50 /* 51 个人理解: 52 texcoord的值是0-1 53 是按照未缩放和未平移情况下计算的纹理坐标,因此才是0-1 54 uv是 *缩放+平移 的结果,结果不一定再0-1之间 55 tex2D按照uv在纹理上采样 56 */ 57 // 方法等同 58 // v.uv = data.texcoord * _MainTex_ST.xy + _MainTex_ST.zw; 59 v.uv = TRANSFORM_TEX(data.texcoord, _MainTex); 60 61 return v; 62 } 63 64 fixed4 frag(v2f v) : SV_Target { 65 fixed3 worldVetNormal = normalize(v.worldNor); 66 // fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); 67 fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(v.worldPos)); 68 69 fixed3 albedo = tex2D(_MainTex, v.uv).rgb * _Color.rgb; // 疑惑,采样结果的类型 70 71 // 环境光 72 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo; 73 74 // 漫反射 75 fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldVetNormal, worldLightDir)); 76 77 // 高光 78 // fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz); 79 fixed3 viewDir = normalize(UnityWorldSpaceViewDir(v.worldPos)); 80 fixed3 halfDir = normalize(viewDir + worldLightDir); 81 fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(halfDir, worldVetNormal)), _Gloss); 82 83 return fixed4(ambient + diffuse + specular, 1); 84 } 85 86 ENDCG 87 } 88 } 89 90 FallBack "Specular" 91 }
urp管线
1 Shader "Unity Shaders Book/Chapter 7/Single Texture" { 2 Properties { 3 _MainTex("MainTex", 2D) = "white"{} 4 _Color("Color Tint", Color) = (1, 1, 1, 1) 5 _Specular("Specular", Color) = (1, 1, 1, 1) 6 _Gloss("Gloss", Range(10, 256)) = 20 7 } 8 9 SubShader { 10 Tags { 11 "RenderPipeline"="UniversalPipeline" 12 } 13 Pass { 14 Tags { 15 "LightMode"="UniversalForward" 16 } 17 18 HLSLPROGRAM 19 #pragma vertex vert 20 #pragma fragment frag 21 22 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" 23 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" 24 25 CBUFFER_START(UnityPerMaterial) 26 float4 _MainTex_ST; 27 half4 _Color; 28 half4 _Specular; 29 float _Gloss; 30 CBUFFER_END 31 32 TEXTURE2D(_MainTex); 33 SAMPLER(sampler_MainTex); 34 35 struct a2v { 36 float4 vertex : POSITION; 37 half3 normal : NORMAL; 38 float4 texcoord : TEXCOORD0; // unity会将第一组纹理坐标存储到改变量中 39 }; 40 41 struct v2f { 42 float4 pos : SV_POSITION; 43 half3 worldNormal : TEXCOORD0; 44 float3 worldPos : TEXCOORD1; 45 float2 uv : TEXCOORD2; // 疑惑,是不是float2类型? 46 }; 47 48 v2f vert(a2v data) { 49 v2f v; 50 v.pos = TransformObjectToHClip(data.vertex.xyz); 51 v.worldPos = mul(UNITY_MATRIX_M, data.vertex).xyz; 52 53 // v.worldNormal = mul(data.normal, unity_WorldToObject); 54 v.worldNormal = TransformObjectToWorldNormal(data.normal); 55 56 /* 57 个人理解: 58 texcoord的值是0-1 59 是按照未缩放和未平移情况下计算的纹理坐标,因此才是0-1 60 uv是 *缩放+平移 的结果,结果不一定再0-1之间 61 tex2D按照uv在纹理上采样 62 */ 63 // 方法等同 64 // v.uv = data.texcoord * _MainTex_ST.xy + _MainTex_ST.zw; 65 v.uv = TRANSFORM_TEX(data.texcoord, _MainTex); 66 67 return v; 68 } 69 70 half4 frag(v2f v) : SV_Target { 71 half3 worldNormal = normalize(v.worldNormal); 72 // half3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); 73 half3 worldLightDir = normalize(_MainLightPosition.xyz); 74 75 half3 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, v.uv).rgb * _Color.rgb; // 疑惑,采样结果的类型 76 77 // 环境光 78 half3 ambient = half3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w) * albedo; 79 80 // 漫反射 81 half3 diffuse = _MainLightColor.rgb * albedo * saturate(dot(worldNormal, worldLightDir)); 82 83 // 高光 84 // half3 viewDir = normalize(_WorldSpaceCameraPos.xyz); 85 half3 viewDir = normalize(_WorldSpaceCameraPos.xyz - v.worldPos); 86 half3 halfDir = normalize(viewDir + worldLightDir); 87 half3 specular = _MainLightColor.rgb * _Specular.rgb * pow(saturate(dot(halfDir, worldNormal)), _Gloss); 88 89 return half4(ambient + diffuse + specular, 1); 90 } 91 92 ENDHLSL 93 } 94 } 95 96 FallBack "Universal Render Pipeline/Simple Lit" 97 }
浙公网安备 33010602011771号