unity3d shader 学习笔记1

在unity中我们经常会使用shader,但是从来没有深究过,最近在做项目时遇到相关问题,无从下手,决定系统学习一番,在此前提下把我学习的过程做一个记录。学习过程中参考了浅墨和风宇冲两位高人的博客,本文有不对的地方,还望指正。

按照学习技术的习惯,在第一次接触shader时,我们首先会想这两个个问题,

问题一:什么是shader,它能做什么?

问题二:unity中shader使用的语言是什么?

问题一:shader,也就是着色器,它本质就是一段程序,这段程序的作用是把Mesh(网格)以指定的方式以及指向的贴图或颜色等处理后,然后通过绘制把处理后的图像显示在屏幕上。所以简而言之:

什么是shader,shader就是一段处理颜色,贴图纹理并且进行计算和变换到渲染器的程序。

unity中shader分两类:Surface Shader(表面着色器)和Vertex Shader &Fragment Shader(顶点着色器&片段着色器)以及Fixed Function Shader(固定功能着色器)下面会讲如何在区分。

shader能做什么呢,比如光影特效,颜色变换等。暂时只想到这些

问题二:unity中的shader使用的是一种shaderLab的语言编写的。它的语法风格类似NVIDIA的CgFX和Direct3D,它具备了显示材质(Material)所需要的一切信息,在unity的shader代码中我们可以使用CG语言写CG程序,所谓CG语言就是C for Graphics,说到一种语言我们就介绍下的他的数据类型,CG语言有6中数据类型,分别是

1. float,32位浮点数据,一个符号位。浮点数据类型被所有的profile支持(但是DirectX8 pixel profiles在一些操作中降低了浮点数的精度和范围);

2. half,16为浮点数据;

3. int,32位整形数据,有些profile会将int类型作为float类型使用;

4. fixed,12位定点数,被所有的fragment profiles所支持;

5. bool,布尔数据,通常用于if和条件操作符(?:),布尔数据类型被所有的profiles支持;

6. sampler*,纹理对象的句柄(the handle to a texture object),分为6类:sampler, sampler1D, sampler2D, sampler3D, samplerCUBE,和samplerRECT。DirectX profiles不支持samplerRECT类型,除此之外这些类型被所有的pixel profiles和 NV40 vertex program profile所支持(CgUsersManual 30页)。由此可见,在不远的未来,顶点程序也将广泛支持纹理操作;

除了上面的基本数据类型外,Cg还提供了内置的向量数据类型(built-in vector data types),内置的向量数据类型基于基础数据类型。例如:float4,表示float类型的4元向量;bool4,表示bool类型4元向量。

注意:向量最长不能超过4元,即在Cg程序中可以声明float1、float2、float3、float4类型的数组变量,但是不能声明超过4元的向量,例如:

float5 array ;// 编译报错

向量初始化方式一般为:

float4 array = float4(1.0, 2.0, 3.0, 4.0);

较长的向量还可以通过较短的向量进行构建:

float2 a = float2(1.0, 1.0);

float4 b = float4(a, 0.0, 0.0);

此外,Cg还提供矩阵数据类型,不过最大的维数不能超过4*4阶。例如:

float1x1 matrix1; // 等价于 float matirx1; x 是字符,并不是乘号!

float2x3 matrix2; // 表示2*3 阶矩阵,包含6 个 float 类型数据

float4x2 matrix3;// 表示 4*2 阶矩阵,包含 8 个 float 类型数据

float4x4 matrix4 ;// 表示4*4 阶矩阵,这是最大的维数

矩阵的初始化方式为:

float2x3 matrix5 = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};

CG语言中也有数组数据类型,它在Cg程序中的作用是:作为函数的形参,用于大量数据的转递。

Cg中声明数组变量的方式和C语言类似:例如:

float a[10]; // 声明了一个数组,包含10 个 float 类型数据

float4 b[10]; // 声明了一个数组,包含10 个 float4 类型向量数据

注意:Cg中向量、矩阵与数组是完全不同,向量和矩阵是内置的数据类型(矩阵基于向量),而数组则是一种数据结构,不是内置数据类型!这一点和C\C++ 中不太一样,在C\C++中,这三者同属于数据结构,数组可以构建向量和矩阵。下一节中将详细阐述Cg中的数组类型。

下面我们来看一段unity的shader代码。打开unity,Assets->Create->Shader,会在Assets路径下创建了一个shader脚本,可以用文本编辑工具打开,我使用的是一个VS的shader插件,可以显示语法高亮。代码如下:

Shader "Custom/NewShader" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}}SubShader {Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM#pragma surface surf Lambertsampler2D _MainTex;struct Input {float2 uv_MainTex;};void surf (Input IN, inout SurfaceOutput o) {half4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG} FallBack "Diffuse"}我们先来看看这段代码的结构,它大体分四块Shader “Custom/NewShader” ,Properties和SubShader以及FallBack “Diffuse”。<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;"></span></span>

简单的可以用如下的形式来概括:

Shader "name"{ [Properties] SubShaders[Fallback] }

用图来说

而它的种子,就是它生命的延续,继续承受风,

unity3d shader 学习笔记1

相关文章:

你感兴趣的文章:

标签云: