US2S3L2——基础数据类型
US2S3L2——基础数据类型
基础数据类型
uint:32为无符号整形
int:32位整形
float:32位浮点数,符号:f
half:16位浮点数,符号:h
fixed:12位浮点数,Shader最常用的浮点数类型,不需要加后缀
bool:布尔类型
string:字符串
sampler:纹理对象句柄
下面都是用于处理纹理(Texture)数据的数据类型,他们的主要区别是纹理的维度和类型
sampler: 通用的纹理采样器,可以用于处理各种不同维度和类型的纹理
sampler1D:用于一维纹理,通常用于对一维纹理进行采样,例如从左到右的渐变色
sampler2D:用于二维纹理,最常见的纹理类型之一。它用于处理二维图像纹理,例如贴图
sampler3D:用于三维纹理,通常用于体积纹理,例如体积渲染
samplerCUBE:用于立方体纹理,通常用于处理环境映射等需要立方体贴图的情况
samplerRECT:用于处理矩形纹理,通常用于一些非标准的纹理映射需求
1234567891011ui ...
US2S3L1——CG语句书写位置及指定着色器函数
US2S3L1——CG语句书写位置及指定着色器函数
本章代码关键字
12345CGPROGRAM //CG语句起始指令ENDCG //CG语句结束指令//cg语句指令#pragma vertex //这个预处理器指令会指定实现顶点着色器的函数#pragma fragment //这个预处理器指令会指定实现片元着色器的函数
CG语句写在哪里
对于顶点/片元着色器来说,CG语句需要写在 Pass 渲染通道语句块中
我们需要在Pass语句块中,加入指令:CGPROGRAM 和 ENDCG
在这两个指令之间 就是我们书写CG代码的地方
12345678910111213141516Shader "TeachShader/Lesson13"{ Properties {...} SubShader { Tags { ... } //... Pass { ...
US2S3——CG语法
US2S3——CG语法
Cg
Cg语言(C for Graphics)是为GPU编程设计的高级着色器语言,由NVIDIA公司开发。
Cg极力保留C语言的大部分语义,并让开发者从硬件细节中解脱出来,
Cg同时也有一个高级语言的其他好处,如代码的易重用性,可读性得到提高,编译器代码优化。
最新版本为3.1,当前已不再被积极开发与支持
Cg语言_百度百科 (baidu.com)
本系列学习内容
CG语句书写位置及指定着色器函数(写CG语法逻辑时,必须使用#pragma vertex和#pragma fragment指定实现着色器的函数)
基础数据类型(fixed,half,sampler,数组声明不同)
特殊数据类型(向量,矩阵,bool 向量存储向量间比较结果)
Swizzle操作符(获取向量分量,重新排列分量,配合低维向量声明高维向量,获取矩阵的某一行或元素,配合向量声明矩阵,高维转低维)
运算符相关(比较,条件(三目),逻辑,数字计算等等)
流程控制语句
函数
顶点-片元着色器基本结构(顶点着色器:将模型顶点转换到裁剪空间;片元着色器:输出片元颜色)
语义(让Shad ...
US2S2L7-3——固定函数着色器
US2S2L7-3——固定函数着色器
固定函数着色器
表面着色器 和 顶点/片元着色器 这两种Unity Shader形式都使用了可编程管线
而对于一些老设备(DX7.0、OpenGL1.5或OpenGL ES 1.1),它们不支持可编程管线着色器
这时就需要使用固定函数着色器来进行渲染,这些着色器只能实现一些非常简单的效果
它的特点是:
需要在 Pass 渲染通道中编写着色器逻辑
需要使用ShaderLab语法中的渲染设置命令来编写,而非CG和HLSL着色器语言
但是由于这些旧设备目前市面上几乎已经没有了,
所以固定函数着色器我们几乎不会再使用,只做了解即可
即使我们现在在Unity中使用固定函数着色器来编写Shader,在内部也会被编译为顶点/片元着色器
因此真正意义的固定函数着色器已经不存在了
例如下面这种Shader:
12345678910111213141516171819Shader "Test/Lesson12"{ Properties { _Color("Main Color" ...
US2S2L7-2——顶点-片元着色器
US2S2L7-2——顶点-片元着色器
顶点/片元着色器
我们可以在创建Shader时,选择创建Unlit Shader来快速创建顶点/片元着色器模板
通过观察,我们发现顶点/片元着色器的着色器代码是编写在 Pass 语句块中
我们需要自己定义每个 Pass 需要使用的Shader代码
虽然比起表面着色器来说我们需要编写的代码较多,
但是好处是灵活性更高,可控性更强,可以控制更多的渲染细节,可以自己决定对性能影响的高低
它的特点是:
需要在Pass渲染通道中编写着色器逻辑
可以使用CG或HLSL两种Shader语言去编写Shader逻辑
代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节
适用于光照处理较少,自定义渲染效果较多时(移动平台首选)
US2S2L7-1——表面着色器
US2S2L7-1——表面着色器
表面着色器
表面着色器(Surface Shader)是Unity自己创造的一种着色器代码类型
它的本质是对顶点/片元着色器的一层封装,它需要的代码量很少,很多工作都帮助我们去完成了
但是缺点是渲染的消耗较大,可控性较低
它的优点在于,它帮助我们处理了很多光照细节,我们可以直接使用而无需自己计算实现光照细节
我们可以在创建Shader时,选择创建Standard Surface Shader
通过观察该Shader文件的内部结构,
会发现着色器相关代码被放在 SubShader 语句块中(并非 Pass )的 CGPROGRAM 和 ENDCG 之间
表面着色器的特点就是:
直接在 SubShader 语句块中书写着色器逻辑
我们不需要关心也不需要使用多个 Pass,每个 Pass 如何渲染,Unity会在内部帮助我们去处理
可以使用 CG 或 HLSL 两种 Shader 语言去编写 Shader 逻辑
代码量较少,可控性较低,性能消耗较高
适用于处理需要和各种光源打交道的着色器(主机、PC平台时更适用,移动平台需要考虑性 ...
US2S2L7——Shader的编写形式
US2S2L7——Shader的编写形式
Shader的形式
通过之前的课程,我们已经对Shader文件的文件结构有一定的认识,并且学习了ShaderLab语法相关的知识
通过学习我们知道 在Unity Shader当中我们可以通过ShaderLab语法去设置很多内容
比如属性、渲染状态、渲染标签等等,但是其最主要的作用是需要指定各种着色器所需的代码
而这些着色器代码即可以放在 SubShader 子着色器语句块中,也可以放在其中的 Pass 渲染通道语句块中
不同的Shader形式放置着色器代码的位置也有所不同
我们一般会使用以下3种形式来编写Unity Shader:
表面着色器(代码量较少,可控性较低)
顶点-片元着色器(更为灵活,重点学习)
固定函数着色器(基本已弃用,了解即可)
我们应该如何选择呢?
固定函数着色器基本已弃用,不是我们学习的重点
对于PC、主机性能较高的设备,为了追求更好的效果,使用表面着色器可能更加的方便
对于移动设备,为了权衡效果和性能,优先使用顶点/片元着色器
在有很多自定义的渲染效果时,优先使用顶点/片元着色器,因为更灵活可控
而表面着色器 ...
US2S2L6——Shader的备用着色器
US2S2L6——Shader的备用着色器
回顾:ShaderLab的基本结构
ShaderLab主要由4个部分组成
Shader的名字
Shader的属性
1~n个子着色器
备用的Shader
本章代码关键字
1Fallback "备用Shader名"
备用Shader
我们知道ShaderLab当中允许有多个 SubShader 子着色器
当执行渲染时,会从上到下使用第一个能够正常执行的 SubShader 子着色器来渲染对象
那有没有可能所有 SubShader 子着色器都不能够在显卡上执行呢?答案是肯定的
有可能出现在某一个设备上,我们自定义的所有 SubShader 都无法正常执行(设备显卡无法支持一些api等情况)
那么这时 备用Shader 就可以起到很大作用了,它至少可以让对象能够正常渲染出来
因此:备用Shader 主要作用就是当Shader文件中的所有 SubShader 子着色器都无法正常运行时
起到一个保险作用,让物体能够使用一个最低级的Shader去渲染出来(效果略差,但至少能够显示)
它的主要作用就是提供“救命稻草”,我 ...
US2S2L5-3——Pass-渲染通道
US2S2L5-3——Pass-渲染通道
回顾:SubShader的基本构成
SubShader语句块中主要由3部分构成:渲染标签,渲染状态,n个渲染通道
12345 |--------Tags(渲染标签) |--------States(渲染状态)SubShader---|--------Pass(渲染通道1) |--------Pass(渲染通道2) |--------....(渲染通道n)
本章代码关键字
123456789101112131415161718192021UsePass "Pass名(大写)" //可以调用特定的Shader文件内的有名字的Pass语句,需要使用大写Pass {} //Pass渲染通道语句块Name "Pass名" //为Pass渲染通道语句块命名的关键字Tags {} ...
US2S2L5-2——States-渲染状态
US2S2L5-2——States-渲染状态
回顾:
知识必备——片元
SubShader的基本构成:SubShader语句块中主要由3部分构成:渲染标签,渲染状态,n个渲染通道
12345 |--------Tags(渲染标签) |--------States(渲染状态)SubShader---|--------Pass(渲染通道1) |--------Pass(渲染通道2) |--------....(渲染通道n)
本章代码关键字
12345678910111213141516171819202122232425//设置剔除状态Cull Back //背面剔除Cull Front //正面剔除Cull Off //不剔除//是否写入深度缓冲ZWrite On //写入深度缓冲ZWrite ...