pragma
pragma | Function: Tell the editor the name of vertex and fragment shading functions | |
Vertex shader pragma Execute once for each vertex |
#pragma vertex vert | |
Fragment shader compilation directives Executes every pixel |
#progma fragment frga |
Vertex Semantic Binding
model coordinates of vertices | float4 POSITION |
screen coordinates of the vertex | float4 SV_POSITION |
the normal vector coordinates of the vertex | float3 NORMAL |
first UV coordinate | float4 TEXCOORD0 |
2nd...4th UV coordinates | float4 TEXCOORD1...3 |
vertex tangent vector coordinates | float4 TENGENT |
vertex color value | float4 COLOR |
Common function library
Assists in compiling macros and definitions for cross-platform shaders | HLSLSupport.cginc |
Common global variables | UnityShaderVariables.cginc |
Common helper functions | UnityCG.cginc |
light and shadow functions | AutoLight.cginc |
Lighting model related | Lighting.cginc |
Terrain Vegetation Assist | TerrainEngine.cginc |
Note: The source address of the function library is Unity address\Data\CGIncludes | |
UnityCG common functions ( UnityCG function explanation )
Convert vertex model coordinates to vertex screen coordinates | UnityObjectToClipPos |
Instance (SubShader must have Pass channel)
Solid Shader
vertex function | parameter | the coordinate position of each vertex Semantic binding: POSITION (coordinate position) float4 |
return value | pixel position of each vertex Semantic binding: SV_POSITION (pixel position) float4 |
|
Role: Project three-dimensional space coordinates to a two-dimensional window | ||
Fragment function | parameter | without |
return value | Fragment color value float4 |
|
Role: set the pixel color | ||
Color Shader
vertex shader output structure | 空间位置:float4 position:SV_POSITION 0级纹理坐标:float4 color:TEXCOORD0 |
|
顶点函数 | 参数 | 每个顶点的坐标位置 语义绑定:POSITION(坐标位置) float4 |
返回值 | 输出结构体 | |
作用:将顶点当作色彩参数赋值 | ||
片段函数 | 参数 | 顶点着色器输出结构体 |
返回值 | 片段颜色 | |
作用:直接将顶点输出的颜色设置到像素中显示 | ||
漫反射
进入库 | #include "UnityCG.cginc" | ||||||||
顶点输入结构体 | 顶点位置 | (float4)语义绑定:POSITION |
|||||||
法线 | (float3)语义绑定:NORMAL |
||||||||
顶点输出结构体 | 像素位置 | (float4)语义绑定:SV_POSIITON |
|||||||
法线 | (float3)语义绑定:NORMAL |
||||||||
全局变量声明 | 光照颜色(內部值) | (float4)_LightColor0 |
|||||||
漫反射颜色(属性) | |||||||||
顶点函数 | 输入结构体——输入 | ||||||||
输出结构体——输出 | |||||||||
步骤 | 矩阵变换 |
||||||||
计算法线 输入法线扩充 float4(input.normal,0.0) 內部值 unity_WorldToObject 法线计算(固定公式) mul(float4(input.normal,0.0),unity_WorldToObject).xyz |
|||||||||
片段函数 | 顶点输出结构体 | 输入 | |||||||
语义绑定(COLOR) | 输出 | ||||||||
步骤 | 获取输入法线方向(float3) normalize(input.normal) |
||||||||
获取入射光线法线方向(float3) normalize(_WorldSpaceLightPos0.xyz) 备注:_WorldSpaceLightPos0(入射光方向) |
|||||||||
计算漫反射值(float3)
|
|||||||||
合并环境光(float4)
|
|||||||||
Note: You need to set Tags in the Pass channel to forward rendering "LightMode" = "ForwardBase" (the lighting mode is set to forward rendering) |
// 顶点着色器的编译指令
// 每有一个顶点就执行一次
#pragma vertex vert
// 片元着色器的编译指令
// 每有一个像素就执行一次
#pragma fragment frag
#include "UnityCG.cginc"
// 顶点输入结构体
struct appdata
{
// 顶点模型坐标
half4 vertexPos:POSITION;
// 顶点法线向量
half3 vertexNormal:NORMAL;
};
// 顶点输出结构体
struct v2f
{
// 顶点屏幕坐标
half4 screenPos:SV_POSITION;
// 顶点屏幕法线
half3 screenNormal:NORMAL;
};
// 声明漫反射颜色属性
half4 _DiffuseCol;
// 光照颜色【内部变量】
half4 _LightColor0;
// 顶点函数
v2f vert(appdata data)
{
// 顶点输出结构体对象
v2f o;
// 将顶点模型坐标转换为顶点屏幕坐标
o.screenPos = UnityObjectToClipPos(data.vertexPos);
// 将顶点模型法线转换为顶点屏幕法线
o.screenNormal = mul(half4(data.vertexNormal,1),unity_WorldToObject).xyz;
// 返回结果
return o;
}
// 片元函数
half4 frag(v2f vertexInput):COLOR
{
// 求入射光线的单位向量
half3 lightDir = normalize(_WorldSpaceLightPos0);
// 求法线向量的单位向量
half3 normalDir = normalize(vertexInput.screenNormal);
// 通过漫反射公式计算所得每个像素的颜色【兰伯特】
//half3 diffuseColor = _DiffuseCol.rgb * _LightColor0.rgb * max(0,dot(lightDir,normalDir));
// 通过漫反射公式计算所得每个像素的颜色【半兰伯特】
half3 diffuseColor = _DiffuseCol.rgb * _LightColor0.rgb * (0.5 * (dot(lightDir,normalDir) + 0.5));
// 添加漫反射颜色再加上环境光
return half4(diffuseColor,1) + UNITY_LIGHTMODEL_AMBIENT;
}