UnityShader快速入门(1)UnityShader的结构
1. 简介
1.1 什么是shader
Shader的中文翻译是着色器,是一类面对GPU编程语言的总称。
Shader其实就是一段代码,这段代码的作用是告诉GPU具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。
更具体的讲:
- GPU流水线上–些可高度编程的阶段,而由着色器编译出来的最终代码是会在GPU.上运行的(对于固定管线的渲染来说,着色器有时等同于–些特定的渲染设置);
- 有一些特定类型的着色器,如顶点着色器、片元着色器等;
- 依靠着色器我们可以控制流水线中的渲染细节,例如用顶点着色器来进行顶点变换以及传递数据,用片元着色器来进行逐像素的渲染。
1.2 shader语言有哪些
既然Shader是一段代码,那必然要用一种语言来书写它,目前主流的有三种语言:
- 基于OpenGL
OpenGL Shading Language,简称GLSL。 - 基于DirectX
High Level Shading Language,简称HLSL。 - 基于NVIDIA
C for Graphic,简称Cg语言。
GLSL与HLSL分别是基于OpenGL和Direct3D的接口,两者不能混用。
而Cg语言是用于图形的C语言。
这其实说明了当时设计人员的一个初衷,就是让基于图形硬件的编程变得和C语言编程一样方便,自由。
正如C++和 Java的语法是基于C的,Cg语言本身也是基于C语言的。
如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的。
Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性高等。
Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致。
所以,HLSL和Cg其实是同一种语言。
1.3 什么是UnityShader
Unity Shader严格来说并不是传统上的Shader,而是Unity自身封装后的一种便于书写的Shader,又称为ShaderLab。
其实在Unity中反而一切变的简单起来了,我们只需关心如何去这实现我们想要的效果就好了,其余的事情全部交给Unity来自动处理。
因为我们在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着色器语言。
官方建议使用Cg/HLSL来编写ShaderLab,因为Cg/HLSL有更好的跨平台性。
2. UnityShader的结构
一段完整UnityShader代码的结构应该如下面的例子所示:
Shader "Path/ShaderName"
{
Properties
{
}
SubShader
{
Pass
{
}
}
FallBack "Diffuse"
CustomEditor "EditorName"
}
从整体来看的话,大致是这样的一个框架结构:
Shader “name” { [Properties] SubShaders [FallBack] [CustomEd