学习Shader第0步 :)
Unity Shader不是真正的Shader,Unity Shader是使用ShaderLab来编写的。ShaderLab是Unity提供的一种说明性语言。对于表面着色器和顶点片元着色器,我们可以在ShaderLab内部,CGPROGRAM和ENDCG之间,嵌套CG/HLSL语言来编写这些着色器代码。
Unity Shader代码的基本结构如下:
//Shader "Shader名称"
Shader "Custom/ExampleShader"
{
//Properties的作用仅仅是为了让这些属性出现在Inspector面板中
//即使我们不在Properties中声明这些变量,也可以直接在CG代码中定义
Properties
{
//格式: 变量名("面板显示变量名", 类型) = 默认值
// 下面列出了Properties支持的所有属性类型
//numbers and sliders
_Int("Int", Int) = 2
_Float("Float", Float) = 1.2
_Range("Range", Range(0.0, 1.0)) = 0.5
//colors and vectors
_Color("Color", Color) = (1, 0, 1, 1)
_Vector("Vector", Vector) = (1, 2, 3, 4)
//textures
_2D("2D", 2D) = "" {}
_Cube("Cube", Cube) = "white" {}
_3D("3D", 3D) = "black" {}
}
//至少需要一个SubShader
SubShader
{
//状态设置。可选的。
//例如可以设置剔除模式,深度测试使用的函数,开启混合模式等
Cull Off ZWrite Off ZTest Always
//标签。可选的
//是一个键值对,键和值都是字符串类型。告诉Unity的渲染引擎怎样以及何时渲染这个对象
//例如可以控制渲染顺序,对着色器进行分类,禁用批处理等
Tags { "RenderType" = "Opaque" }
//状态和标签也可以声明在Pass中。在SubShader中设置,将会用于所有Pass
//定义一次完整的渲染流程。Pass过多会造成渲染性能下降
//如果是表面着色器则需要将Pass内代码块提出来,不需要定义Pass
Pass
{
//使用CG/HLSL语言编写
CGPROGRAM
//着色器代码。。。
ENDCG
}
}
//如果显卡不能运行上面所有的SubShader,就使用 Diffuse 吧
//或者: Fallback Off 关闭Fallback功能
Fallback "Diffuse"
}
参考:《Unity Shader入门精要》 冯乐乐(著)
网友评论