URP学习之基础的法线采样
Shader "Custom/Normal"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
[Normal]_MainNorTex("Normal",2D) = "Bump"{}
_BaseColor ("BaseColor", Color) = (1,1,1,1)
}
SubShader
{
Tags {
"RenderPipeline"="UniversalRenderPipline"
"RenderType"="Opaque"
}
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
CBUFFER_START(UnityMaterial)
float4 _MainTex_ST;
float4 _BaseColor;
CBUFFER_END
//定义和采样贴图
TEXTURE2D (_MainTex);
SAMPLER(sampler_MainTex);
float4 MainTex (float2 uv)
{
return SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,uv);
}
TEXTURE2D(_MainNorTex);
SAMPLER(sampler_MainNorTex);
float3 NorTex(float2 uv)
{
return UnpackNormal(SAMPLE_TEXTURE2D(_MainNorTex,sampler_MainNorTex,uv));
}
//定义和采样贴图结束
struct appdata
{
float4 vertex:POSITION;
float4 normal:NORMAL;
float4 tangent:TANGENT;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex:SV_POSITION;
float3 normal:NORMAL;
float3 tangent:TANGENT;
float2 uv:TEXCOORD0;
float3 Btangent:TEXCOORD1;
float3 NdotL:TEXCOORD2;
};
ENDHLSL
pass{
HLSLPROGRAM
#pragma vertex VERT
#pragma fragment FRAG
v2f VERT( appdata i)
{
v2f o;
o.vertex = TransformObjectToHClip(i.vertex.xyz);
o.tangent = normalize(TransformObjectToWorld(i.tangent.xyz));
o.normal = normalize(TransformObjectToWorldNormal(i.normal.xyz));
//副切线获取途径 cross(法线,切线) * 切线.w
o.Btangent= cross(o.normal.xyz,o.tangent.xyz) * i.tangent.w;
o.uv = i.uv;
return o;
}
float4 FRAG(v2f i):SV_TARGET
{
//引入采样好的贴图生成变量
float4 var_MainTex = MainTex (i.uv);
float3 var_MainNorTex = NorTex(i.uv);
//制作TBN矩阵
float3x3 TBN = float3x3(i.tangent,i.Btangent,i.normal);
//利用TBN矩阵变换法线空间
float3 nDirWS = normalize(mul(var_MainNorTex,TBN));
//获取主灯光函数
Light MainLight = GetMainLight();
//法线Dot灯光
float NdotL = (dot(nDirWS,MainLight.direction.xyz))*0.5+0.5;
return NdotL.xxxx*var_MainTex * MainLight.color.rgbb;
}
ENDHLSL
}
}
// FallBack "Diffuse"
}