赞
踩
下面是几种Shader的例子,从简单到复杂,一步一步了解 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"
}
当存在多个语义时,
例如: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)从顶点着色器到片元着色器。
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’
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。