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
翻译Shader(6)---法线贴图(切线空间)
最新推荐文章于 2024-09-13 11:01:26 发布