首页 > 学院 > 开发设计 > 正文

shader学习之实例混合高光,漫反射,法线贴图,纹理,以及多光源的shader

2019-11-07 23:01:28
字体:
来源:转载
供稿:网友
Shader "Unlit/example11-1Lighting"{PRoperties{_MainTex ("Texture", 2D) = "white" {}_BumpTex("法线纹理",2D)="bump"{}_BumpScale("纹理缩放",Range(0,1))=  5_Gloss("高光大小",Range(5,258)) = 20}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{   Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag                        #pragma multi_compile_fwdbase#include "UnityCG.cginc"#include "Lighting.cginc"struct v2f{float4 uv : TEXCOORD0;float3 tangentLightDir:TEXCOORD1;float3 tangentViewDir:TEXCOORD2;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpTex;float4 _BumpTex_ST;float _BumpScale;float _Gloss;v2f vert (appdata_full v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv.xy = v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;o.uv.zw = v.texcoord.xy*_BumpTex_ST.xy+_BumpTex_ST.zw;TANGENT_SPACE_ROTATION;//切线空间的光线方向o.tangentLightDir = normalize(mul(rotation,UnityWorldSpaceLightDir(v.vertex)));//切线空间的视线方向o.tangentViewDir = normalize(mul(rotation,UnityWorldSpaceViewDir(v.vertex)));return o;}fixed4 frag (v2f i) : SV_Target{   float3 tangentLightDir = i.tangentLightDir;float3 tangentViewDir = i.tangentViewDir;//提取法线贴图中的法线float3 tangentNormal = UnpackNormal(tex2D(_BumpTex,i.uv.zw)).xyz;       tangentNormal.xy *= _BumpScale;//修改深度和偏移tangentNormal.z = sqrt(1 - saturate(dot(tangentNormal.xy ,tangentNormal.xy )));float4 albedo = tex2D(_MainTex,i.uv.xy);//纹理采样float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;  //环境光//漫反射float3 diffColor = _LightColor0.rgb * ambient * albedo.rgb * (max(0,dot(tangentLightDir,tangentNormal)) * 0.5 + 0.5);//半角向量float3 halfDir = normalize(tangentLightDir + tangentViewDir);//高光float3 specColor = _LightColor0.rgb * pow(max(0,dot(halfDir,tangentNormal)),_Gloss);float atten = 1.0;float4 color = float4((specColor + diffColor + ambient) * atten, albedo.a);return color;}ENDCG}Pass{       Tags{"LightMode" = "ForwardAdd"}       Blend One OneCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdadd#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"struct v2f{float4 uv : TEXCOORD0;float3 tangentLightDir:TEXCOORD1;float3 tangentViewDir:TEXCOORD2;   float3 worldPos:TEXCOORD3;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpTex;float4 _BumpTex_ST;float _BumpScale;float _Gloss;v2f vert (appdata_full v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv.xy = v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;o.uv.zw = v.texcoord.xy*_BumpTex_ST.xy+_BumpTex_ST.zw;o.worldPos = mul(_Object2World,v.vertex);  TANGENT_SPACE_ROTATION;//开始区分光源#ifdef USING_DIRECTIONAL_LIGHT//切线空间的光线方向o.tangentLightDir = normalize(mul(rotation,UnityWorldSpaceLightDir(v.vertex)));//切线空间的视线方向o.tangentViewDir = normalize(mul(rotation,UnityWorldSpaceViewDir(v.vertex)));#elseo.tangentLightDir = normalize(mul(rotation,(_WorldSpaceLightPos0.xyz - mul(_Object2World,v.vertex))));o.tangentViewDir = normalize(mul(rotation,UnityWorldSpaceViewDir(v.vertex)));#endif//结束区分   return o;}//片段着色器fixed4 frag (v2f i) : SV_Target{   //开始区分光源   #ifdef USING_DIRECTIONAL_LIGHT//光照衰减系数float3 atten = 1.0;#elsefloat3 lightCoord = mul(_LightMatrix0,float4(i.worldPos,1)).xyz;float3 atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;#endif//结束区分   float3 tangentLightDir = i.tangentLightDir;float3 tangentViewDir = i.tangentViewDir;//计算切线空间的法线float3 tangentNormal = UnpackNormal(tex2D(_BumpTex,i.uv.zw)).xyz;       tangentNormal.xy *= _BumpScale;//法线深度tangentNormal.z = sqrt(1 - saturate(dot(tangentNormal.xy ,tangentNormal.xy )));float4 albedo = tex2D(_MainTex,i.uv.xy);float3 diffColor = _LightColor0.rgb *  albedo.rgb * max(0,dot(tangentLightDir,tangentNormal));float3 halfDir = normalize(tangentLightDir + tangentViewDir);float3 specColor = _LightColor0.rgb * pow(max(0,dot(halfDir,tangentNormal)),_Gloss);float4 color = float4((specColor + diffColor) * atten, albedo.a);//最终颜色return color;}ENDCG}}}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表