UnityShader学习总结
1、内容概述
由于仓库里写了笔记就不搬了
如空间转换:
光照模型:
高度贴图的使用:
Shader "Bump/Bump_HeightMap"
{
Properties
{
[NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}
[NoScaleOffset]_DepthMap("Depth Map", 2D) = "bump" {}
_Scale("Scale", Range(1, 10)) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
Tags {"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 lightDir: TEXCOORD1;
float3 viewDir : TEXCOORD2;
};
sampler2D _MainTex;
sampler2D _DepthMap;
float _Scale;
float4 _DepthMap_TexelSize;
float4 _MainTex_ST;
v2f vert (appdata_tan v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
o.uv = TRANSFORM_TEX(o.uv, _MainTex);
//注意此函数 v 必须要有切线和法线
TANGENT_SPACE_ROTATION;
o.lightDir = mul(unity_WorldToObject, _WorldSpaceLightPos0).xyz;
o.lightDir = mul(rotation, o.lightDir);
return o;
}
//根据高度贴图的UV分别计算切线,然后根据切线来得到新的法线
float3 CalculateNormal(float2 uv)
{
//_DepthMap_TexelSize : 它的前两个分量包含纹理像素大小(以U和V的分数表示)。其他两个分量包含像素数量。例如,在256×128纹理的情况下,它将包含(0.00390625、0.0078125、256、128)。
float2 du = float2(_DepthMap_TexelSize.x * 0.5, 0);
float u1 = tex2D(_DepthMap, uv - du);
float u2 = tex2D(_DepthMap, uv + du);
float3 tu = float3(1, 0, (u2 - u1) * _Scale);
float2 dv = float2(0, _DepthMap_TexelSize.y * 0.5);
float v1 = tex2D(_DepthMap, uv - dv);
float v2 = tex2D(_DepthMap, uv + dv);
float3 tv = float3(0, 1, (v2 - v1) * _Scale);
//cross(tv, tu)和cross(tu, tv)是有区别的,我们希望向量指向上方,所以必须是cross(tv, tu)
return normalize(cross(tv, tu));
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 albedo = tex2D(_MainTex, i.uv);
float3 normal = CalculateNormal(i.uv);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo.rgb;
fixed3 diffuse = albedo.rgb * _LightColor0.rgb * saturate(dot(normal, i.lightDir));
//只是用了漫反射
fixed4 finalColor = fixed4(ambient + diffuse, 1.0);
return finalColor;
}
ENDCG
}
}
}
// 内置shader
//struct appdata_tan {
// float4 vertex : POSITION;
// float4 tangent : TANGENT;//切线
// float3 normal : NORMAL;
// float4 texcoord : TEXCOORD0;
// UNITY_VERTEX_INPUT_INSTANCE_ID
//};
2、Gitee地址
主要学习参考
主要参考
- Games101
- Shader入门精要
- CatLikeCoding