下面是几种Shader的例子,从简单到复杂,一步一步了解 Shader 的编写机制。
Unity Shader的分类
- 顶点/片元着色器 Vertex/Fragment Shader,下面我们介绍的示例就是这个。
- 表面着色器 Surface Shader ,而这个底层Unity也是转成了顶点/片元着色器
- 固定函数着色器 Fixed Function Shader (已弃用) 在一些低端设备使用 表面着色器是对顶点/片元着色器做的一层封装。
示例目录
- Shader基本结构
- Shader中定义结构体,简化程序
- 由顶点着色器,编写漫反射Shader程序
- 由顶点着色器控制漫反射,同时增加Inspector面板控制
- 片元着色器漫反射Shader
- 半兰伯特光照模型
- 顶点着色器+高光反射
- 外部控制+高光反射
1、Shader的基本结构
Unity Shader不是真正的Shader,Unity Shader是ShaderLab来编写,ShaderLab是Unity提供的一种说明性语言。表面着色器和顶点片元着色器,在ShaderLab内部,在CGPROGRAM和ENDCG之间,嵌套CG/HLSL语言来编写这些着色器代码。
Shader "name"
{
[Properties]
SubShader { } //可以有多个,unity会找到第一个被用户机器支持的子着色器
[Fallback] //如果没有子着色器被支持,那么会尝试使用指定的降级着色器
}
Shader "Shader Name"{
Properties{
//属性
}
SubShader{
//显卡A使用的子着色器
}
SubShader {
//显卡B使用的子着色器
}
Fallback "VertexLit"
}
Properties是材质和Unity Shader的桥梁。Properties语义块中包含了一系列属性(property),这些属性将会出现在材质面板中。
下面的例子呈现了基本属性和变量定义:
Shader "My/01 shader"{
Properties{
_Color("Color",Color) = (1,1,1,1)//颜色
_Vector("Vector",Vector) = (3,2,3,1)//向量
_Int("Int",Int) = 234//int类型
_Float("Float",Float) = 1.2
_Range("Range",Range(2,8)) = 6//范围值
_2D("Texture",2D) = "red"{}//贴图
_Cube("Cube",Cube) = "white"{}//天空盒
_3D("Texure",3D) = "black"{}//3D贴图
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 _Color;
int _Int;
//float _Int;这里用float定义_Int也可以
float _Float;
float _Range;
sampler2D _2D;
samplerCUBE _Cube;
sampler3D _3D;
float4 vert(float4 v:POSITION):SV_POSITION{
return UnityObjectToClipPos(v);
}
fixed4 frag():SV_Target{
return fixed4 (_Int,1,1,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
2、定义结构体
当存在多个语义时,
例如:vertex:POSITION,float4 normal:NORMAL
float4 vert(float4 v:POSITION,float4 normal:NORMAL):SV_POSITION{
return UnityObjectToClipPos(v);
}
可以定义两个结构体a2v(application to vertex)从应用到顶点着色器,v2f(vertex to fragment)从顶点着色器到片元着色器。文章来源:https://www.toymoban.com/news/detail-490751.html
Shader "My/02 shader"{
Properties{
_Color("Color",Color) = (1,1,1,1)
_Vector("Vector",Vector) = (3,2,3,4)
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include <UnityShaderUtilities.cginc>
//application to vertex
struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 position:SV_POSITION;
float3 color:COLOR;
};
v2f vert(a2v v){
v2f f;
f.position = UnityObjectToClipPos(v.vertex);//顶点转为裁剪空间
return f;
}
fixed4 frag(v2f f):SV_Target{
return fixed4(1,1,1,1);
}
ENDCG
}
}
}
更多例子
公众号回复’sh’文章来源地址https://www.toymoban.com/news/detail-490751.html
到了这里,关于Shader学习第七篇:几种Unity的Shader的例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!