庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili
渲染流程
模型 - 输入结构 - 顶点Shader - 输出结构 - 像素Shader - 渲染结果

关联编辑器

SF新建最简Shader模板

ShaderForge设置

Geometry - 一般选择插值
Interpolated(插值会比较简单)
Normalized
归一化会在每一个像素将Normal去做一个归一化,如果一个向量,它有方向,但是它的大小没有什么含义,但是这个方向经常进行各种点乘Dot,一般会做一个归一化,Normalized会让点乘产生的结果是精确的.

最简Shader模板

HelloWorld

Shader "AP01/L03/FlatCol"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
Name "FORWARD"
Tags { "LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
// 输入结构
struct VertexInput
{
float4 vertex : POSITION; // 将模型的顶点信息输入进来
};
// 输出结构
struct VertexOutput
{
float4 pos : SV_POSITION; // 由模型顶点信息换算而来的顶点屏幕位置
};
// 输入结构>>>顶点Shader>>>输出结构
VertexOutput vert (VertexInput v)
{
VertexOutput o = (VertexOutput)0; // 新建一个输出结构
o.pos = UnityObjectToClipPos( v.vertex ); // 变换顶点信息 并将其塞给输出结构
return o; // 将输出结构 输出
}
// 输出结构>>>像素
float4 frag(VertexOutput i) : COLOR
{
// Lighting:
// Emissive:
//float3 emissive = float3(1,0.4605795,0);
//float3 finalColor = emissive;
//return fixed4(finalColor,1);
return float4(1, 1, 1, 1);
}
ENDCG
}
}
FallBack "Diffuse"
}
代码Lambert


Shader "AP01/L03/Lambert"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
Name "FORWARD"
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
// 输入结构
struct VertexInput
{
float4 vertex : POSITION; // 将模型顶点信息输入进来
float4 normal : NORMAL; // 将模型法线信息输入进来
};
// 输出结构
struct VertexOutput
{
float4 pos : SV_POSITION; // 由模型顶点信息换算而来的顶点屏幕位置
float3 nDirWS : TEXCOORD0; // 由模型法线信息换算来的世界空间法线信息
};
// 输入结构>>>顶点Shader>>>输出结构
VertexOutput vert (VertexInput v)
{
VertexOutput o = (VertexOutput)0; // 新建一个输出结构
o.pos = UnityObjectToClipPos( v.vertex ); // 变换顶点信息 并将其塞给输出结构
o.nDirWS = UnityObjectToWorldNormal(v.normal); // 变换法线信息 并将其塞给输出结构
return o; // 将输出结构 输出
}
// 输出结构>>>像素
float4 frag(VertexOutput i) : COLOR
{
float3 nDir = i.nDirWS; // 获取nDir
float3 lDir = _WorldSpaceLightPos0.xyz; // 获取lDir
float nDotl = dot(i.nDirWS, lDir); // nDir点积lDir
float lambert = max(0.0, nDotl); // 截断负值
return float4(lambert, lambert, lambert, 1.0); // 输出最终颜色
}
ENDCG
}
}
FallBack "Diffuse"
}
常用参数节点

