shader-凹凸纹理

tech2022-09-30  66

凹凸纹理

效果过程代码

效果

过程

使法线纹理上存储的信息,将相关变量转到切线空间进行统一计算。 漫反射由法线方向和光源方向求得, 高光由半方向和法线方向求得, 半方向由光源方向和法线求得, 环境光可以由系统内置变量拿到,

代码

Shader "Custom/NorMalTangentSpaceMat" { //9 Properties{ //定义变量 _Color ( "Color", Color) = (1,1,1,1)//总颜色参数 _MainTex ("Main Tex", 2D ) = "white" {} //主贴图 _BumpMap( "Normal Map", 2D) = "bump" {} //凹凸纹理贴图 _BumpScale("Bump Scale", Float) = 1 //凹凸程度 _Specular ("Specular", Color) = (1,1,1,1) //高光颜色 _Gloss ("Gloss", Range(2,256)) = 20//高光范围 } SubShader{ Pass{ Tags{ "LightMode" = "ForwardBase" } //渲染模式 CGPROGRAM//cg代码开始 //顶点着色器 #pragma vertex vert //片元着色器 #pragma fragment frag //引用内置光照文件 #include "Lighting.cginc" fixed4 _Color;//总颜色定义 sampler2D _MainTex; //定义主贴图 sampler2D _BumpMap;//定义凹凸法线贴图 float _BumpScale;//凹凸程度 fixed4 _Specular;//高光颜色 float _Gloss;//高光范围 float4 _MainTex_ST;//主图纹理缩放与偏移 float4 _BumpMap_ST;//凹凸纹理缩放与偏移 struct a2v{ float4 vertex : POSITION;//接收顶点 float3 normal :NORMAL;//接收法线向量 float4 tangent : TANGENT;//接收切线向量 float4 texcoord : TEXCOORD0;//接收纹理坐标 }; struct v2f { float4 pos : SV_POSITION;//传递顶点 float4 uv : TEXCOORD0;//传递纹理信息 float3 lightDir : TEXCOORD1;//切线空间光照方向 float3 viewDir : TEXCOORD2;//切线空间视线方向 }; v2f vert (a2v v){//顶点着色器 v2f o;//定义顶点函数的输出 o.pos = UnityObjectToClipPos(v.vertex);//顶点转裁剪空间 o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;//计算主图uv o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;//计算凹凸图uv TANGENT_SPACE_ROTATION;//模型空间转切线空间的矩阵 o.lightDir = mul( rotation, ObjSpaceLightDir(v.vertex)).xyz;//计算切线空间的光照方向 o.viewDir = mul ( rotation, ObjSpaceViewDir(v.vertex)).xyz;//计算切线空间的视线方向 return o;//计算结果传递给片元 }; fixed4 frag (v2f f ):SV_Target{//定义片元函数, 接收参数为顶点函数的结果,输出为最值颜色值 fixed3 tangentLightDir = normalize ( f.lightDir );//归一化 切线空间的光照方向 fixed3 tangentViewDir = normalize (f.viewDir); //归一化 切线空间的视线方向 fixed4 packedNormal = tex2D ( _BumpMap, f.uv.zw ); //对凹凸纹理采样 fixed3 tangentNormal;//定义切线空间法线 tangentNormal = UnpackNormal (packedNormal);//计算切线空间法线 tangentNormal.xy *= _BumpScale;//切线空间法线*凹凸程度 tangentNormal.z = sqrt ( 1.0- saturate (dot (tangentNormal.xy, tangentNormal.xy)) );//计算切线空间的副法线 z =sqrt( x^2 + y^2) fixed3 albedo = tex2D ( _MainTex, f.uv ).rgb * _Color.rgb;//利用主图纹理信息,计算反射率 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//环境光计算 fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot (tangentNormal, tangentLightDir ));//计算漫反射 fixed3 halfDir = normalize ( tangentLightDir+ tangentViewDir );//计算半向量 fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow ( max (0,dot ( tangentNormal,halfDir )),_Gloss );//计算高光反射 return fixed4( specular + diffuse + ambient, 1);//求和最终结果 }; ENDCG } } FallBack "Diffuse" }
最新回复(0)