shader入门7 法线贴图

简介

法线贴图用来使模型更加细致.
把一个模型做的十分精细非常难,用法线贴图替换原纹理的法线,改变漫反射使我们产生模型凹凸面更多,更细致的错觉.

代码

Shader "Custom/NewSurfaceShader"
{
	Properties{
		_Color("Color",Color) = (1,1,1,1)//贴图颜色
		_MainTex("Main Tex",2D) = "white"{}//贴图
		_NormalTex("Normal Tex",2D) = "white"{}//法线贴图
		_BumpScale("Bump Scale",Float)=1//凹凸的缩放
	}
	SubShader
	{
		pass {
			Tags{ "LightMode" = "ForwardBase" }
			CGPROGRAM
			#include "Lighting.cginc"
			#pragma vertex vert
			#pragma fragment frag
			fixed4 _Color;//贴图颜色
			sampler2D _MainTex;//贴图
			sampler2D _NormalTex;//法线贴图
			fixed4 _MainTex_ST;//缺少这个无法偏移uv
			fixed4 _NormalTex_ST;
			float _BumpScale;
			struct a2v {
				float4 vertex:POSITION;//赋值模型空间顶点位置
				float3 normal:NORMAL;//赋值模型空间法线
				float4 texcoord:TEXCOORD0;//第一张贴图
				float4 tangent:TANGENT;//没有这个 无法执行vert中的宏 变量名不可更改
			};
			struct v2f {
				float4 position:SV_POSITION;//输出的屏幕位置
				float2 mainUv:TEXCOORD2;//贴图的uv
				float2 normalUv:TEXCOORD3;//法线的uv
				float3 lightDir:TEXCOORD4;//切线空间下的光方向
			};
			v2f vert(a2v v) {
				v2f f;
				f.position = UnityObjectToClipPos(v.vertex);//屏幕坐标系下的位置
				f.mainUv = TRANSFORM_TEX(v.texcoord, _MainTex);//得到偏移后的uv
				f.normalUv= TRANSFORM_TEX(v.texcoord, _NormalTex);
				TANGENT_SPACE_ROTATION; //调用这个后之后,会得到一个矩阵 rotation 这个矩阵用来把模型空间下的方向转换成切线空间下
				f.lightDir = normalize(mul(rotation, ObjSpaceLightDir(v.vertex)));//切线空间下光的方向
				return f;
			}
			fixed4 frag(v2f f) :SV_Target{
				fixed4 normalColor = tex2D(_NormalTex,f.normalUv);//采样
				fixed3 tangentNormal = UnpackNormal(normalColor);//切线
				tangentNormal.xy = tangentNormal.xy*_BumpScale;
				tangentNormal = normalize(tangentNormal);
				fixed3 texColor = tex2D(_MainTex, f.mainUv) * _Color.rgb;//贴图颜色
				fixed3 diffuse = _LightColor0.rgb * max(dot(tangentNormal, f.lightDir), 0) *texColor;//漫反射颜色 用了法线贴图的颜色 与切线空间下光的方向
				return fixed4(texColor * UNITY_LIGHTMODEL_AMBIENT.rgb +diffuse,1);
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值