翻译Shader(6)---法线贴图(切线空间)

Shader "BBBBBBBBBB/贴图/03---法线贴图" {
	Properties{
		_MainTex("Main Texture",2D) = "white"{}// 纹理贴图
		_BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)// 控制纹理贴图的颜色
		//由于我们本次只计算漫反射,所以只需要_MainTex和_BaseColor
		_BumpTex("Bump Texture",2D) = "bump"{}// 表示当该位置没有指定任何法线贴图时,就使用模型顶点自带的法线
		_BumpScale("Bump Scale",Float) = 1.0// 法线贴图的凹凸参数。为0表示使用模型原来的发现,为1表示使用法线贴图中的值。大于1则凹凸程度更大。
	}
		SubShader{
			pass {
				Tags{"LightMode" = "ForwardBase"}
				CGPROGRAM
				#pragma vertex Vertex
				#pragma fragment Pixel
				#include "Lighting.cginc"// 取得第一个直射光的颜色_LightColor0 第一个直射光的位置_WorldSpaceLightPos0(即方向)

				struct vertexInput {

					float4 vertex : POSITION;// 告诉Unity把模型空间下的顶点坐标填充给vertex属性
					float3 normal : NORMAL;// 不再使用模型自带的法线。保留该变量是因为切线空间是通过(模型里的)法线和(模型里的)切线确定的。
					float4 texcoord : TEXCOORD0;
					float4 tangent : TANGENT; // tangent.w用来确定切线空间中坐标轴的方向的。
					//特别注意tangent虽然是法线,但是它是一个float4类型
					//xyz表示切线方向,而第四个分量w表示副切线的方向。如果副切线方向不对,那么
					//最终法线会反向
				};


				struct vertexOutput {

					float4 pos : SV_POSITION;// 声明用来存储顶点在裁剪空间下的坐标
					float2 uv : TEXCOORD0;
					//这里默认凹凸纹理和主纹理使用同一个uv坐标
					//并且我们不对它进行任何的缩放和偏移

					float3 lightDir : TEXCOORD1;
				};

				sampler2D _MainTex;
				sampler2D _BumpTex;
				fixed4 _BaseColor;
				float _BumpScale;

				vertexOutput Vertex(vertexInput v) {

					vertexOutput o;
					o.pos = UnityObjectToClipPos(v.vertex);
					o.uv = v.texcoord;

					float3 binormal = cross(normalize(v.normal),normalize(v.tangent.xyz)) * v.tangent.w;
					//先计算副切线,就是把法线和切线进行叉积计算,然后乘以副切线的方向参数

					float3x3 _2tangentSpace = float3x3(v.tangent.xyz,binormal,v.normal);
					//按照切线,副切线,法线的顺序拼在一起就是切线空间的变换矩阵

					o.lightDir = mul(_2tangentSpace,ObjSpaceLightDir(v.vertex).xyz);
					//把光源方向转换到切线空间

					return o;
				}

				fixed4 Pixel(vertexOutput i) :SV_TARGET{

					fixed3 tangentLightDir = normalize(i.lightDir);

					fixed4 packedNormal = tex2D(_BumpTex,i.uv);
					//先对法线纹理进行采样,注意这个采样值暂时还不能用,需要映射

					fixed3 tangent
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值