Shader 入门精要笔记(5)
Unity Shader 的形式:
Shader "MyShader"
Properties{
//真正意义上的 Shader 代码会出现在这里
//表面着色器(Surface Shader)或者
//顶点/片元着色器(Vertex/Fragment Shader)或者
//固定函数着色器(Fixed Function Shader)
}
SubShader{
//和上一个SubShader类似
}
}
表面着色器:Surface Shader 是Unity自己创造的一种着色器代码类型。它需要的代码量很少,渲染代价很大(Unity在背后做了很多工作)Unity提供了它,它在背后仍然把它转换成了相应的顶点/片元着色器。它自动提供了很多光照细节:
Shader "Custom/Simple Surface Shader"{
SubShader{
Tags{ "RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float4 color : COLOR;
};
void surf (Input In, inout SurfaceOutput o){
o.Albedo = 1;
}
ENDCG
}
Fallback "Diffuse"
}
表面着色器被定义在SubShader语义块(并非PASS语义块)中的CGPROGRAM与ENDCG之间。不用关心Pass,Unity在背后已经做了这些工作,这里的CG/HLSL是Unity经过封装后提供的,语法和标准几乎一样除了原生的函数和用法Unity未提供。
顶点/片元着色器:我们可以使用CG/HLSL语言来进行编写,更复杂且更灵活:
Shader "Custom/Simple VertexFragment Shader"{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 v : POSITION) : SV_POSITION{
return mul (UNITY_MATRIX_MVP,v);
}
fixed4 frag() : SV_Target {
return fixed4 (1.0,0.0,0.0,1.0);
)
ENDCG
}
}
}
和表面着色器类似顶点/片元着色器被定义在Pass语义块中的,在CGPROGRAM与ENDCG之间,这里仍使用HLSL和CG语言进行编写
固定函数着色器:
Shader "Tutorial/Basic"{
Properties{
_Color ("Main Color",Color) = (1.0,0.5,0.5,1.0)
}
SubShader {
Pass {
Meaterial{
Diffuse [_Color]
}
Lighting On
}
}
}
固定函数着色器的代码被定义在Pass语义块中,这些代码相当于Pass中的一些渲染设置,再次我们需完全使用shaderlab语义而非HLSL/CG。对于多自定义的渲染效果我们经常使用顶点/片元着色器来进行UnityShader的编写。

浙公网安备 33010602011771号