庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili
渲染流程
模型 - 输入结构 - 顶点Shader - 输出结构 - 像素Shader - 渲染结果
![](https://i-blog.csdnimg.cn/blog_migrate/63c9239e1595145dfcad44d1323b8ab9.png)
关联编辑器
![](https://i-blog.csdnimg.cn/blog_migrate/47823ea865bc6c44fc786dc75d96bcc2.png)
SF新建最简Shader模板
![](https://i-blog.csdnimg.cn/blog_migrate/b6f2eeeb52d0bd999bb6e9b2bb3ed8c5.png)
ShaderForge设置
![](https://i-blog.csdnimg.cn/blog_migrate/8e3753da2ec0f25f3fb8cf766c9eef97.png)
Geometry - 一般选择插值
Interpolated(插值会比较简单)
Normalized
归一化会在每一个像素将Normal去做一个归一化,如果一个向量,它有方向,但是它的大小没有什么含义,但是这个方向经常进行各种点乘Dot,一般会做一个归一化,Normalized会让点乘产生的结果是精确的.
![](https://i-blog.csdnimg.cn/blog_migrate/a766436131c3893dfbe76d664d73b190.png)
最简Shader模板
![](https://i-blog.csdnimg.cn/blog_migrate/0758cead1b08a38b72ce9b66dd222fc0.png)
HelloWorld
![](https://i-blog.csdnimg.cn/blog_migrate/094fc1166c15700b56fa0f069dc36dcb.png)
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
![](https://i-blog.csdnimg.cn/blog_migrate/8e6ff25a882340aa150875854c270663.png)
![](https://i-blog.csdnimg.cn/blog_migrate/55527ed30b1a98cd92d2f4728a6be5be.png)
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"
}
常用参数节点
![](https://i-blog.csdnimg.cn/blog_migrate/8bc6a1266e853ac254a4a230211512e0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d24ebfd7da699a6a9e41f0980ed9ef0f.png)