shader
shaderlab
角色
场景
特效
什么是 GPU?
GPU:Graphic Processing Unit,中文翻译为“图形处理器”。显卡包括(GPU,显存,显卡 BIOS,显卡 PCB板)。
什么是 Shader?
Shader 程序:GPU 执行的,针对 3D 对象进行操作的程序。
Shader 编程有哪几种?
CG:与 DirectX 9.0 以上以及 OpenGL 完全兼容。 运行时或事先编译成 GPU 汇编代码。
HLSL: 主要用于 Direct3D。平台:windows。
GLSL: 主要用于 OpenGL。 平台:移动平台(iOS, 安卓),mac(only use when you target Mac OS X or OpenGL ES 2.0)
为什么 Shader 中选择 CG?
因为 CG/HLSL 比 GLSL 支持更多的平台。
Unity3d 里 CG 输出什么
windows 平台:Direct3D, GPU 汇编代码
mac:OpenGL GPU 汇编代码
flash:flash GPU 汇编代码
ios/android:unity 会将 CG 转换成 GLSL 代码。
总结:也就是除了移动平台会把 CG 转换成 GLSL 代 码,其余平台都是转换成汇编代码。
什么是缓冲?
一个像素有如下缓冲:
- 颜色缓存 color buffer/pixel buffer:储存该点即将显示的颜色,RGBA 值
- 深度缓存 depth buffer/z buffer:储存该点的深度,z
- 模板缓存 stencil buffer:通常用作限制渲染区域。更高级用法需结合深度缓冲,例如某像素的模板缓冲值会随着其是否通过深度缓冲测试而改变。
- 累积缓存 Accumulation Buffer: 与颜色缓冲类似,同样储存一个 RGBA 值。累积缓存是为合成多幅图像而设计的,累积缓存提供了一种在保持好的颜色分辨率下实现在场景中“多重曝光(multiple exposures)”的方法。使用累积缓存可以产生许多图像效果来提高图像的真实性,其中包括:反走样、运动模糊、软阴影、深度域(景深)和卷积。要产生这些效果,必须将图像渲染多次,对场景位置(或所选的物体)进行微小的、渐增的改变,然后累积结果。
什么是图元装配(Primitive Assembly)
经过变换的顶点被装配成几何图元
什么是光栅化(又译作栅格化,Rasterization)
栅格化这个术语可以用于任何将矢量图形转换成栅格图像的过程。
在 3D 渲染中主要是指,三角形等图元(矢量)转换成像素碎片的过程。或者说决定哪些像素几何图元覆盖的过程。光栅化的结果是像素位置的集合和片段的集合。
什么是光栅操作(Raster Operation)
指在碎片 fragment 处理后,在更新帧缓存前最后执行的一系列操作。通过包括裁剪,深度测试,alpha 测试,alpha 混合等。
碎片 Fragment 等于像素吗?
像素点:(屏幕上能显示)的最小图像单元。
像素:帧缓存中某个像素点的内容,通常即指颜色。
碎片:更新像素潜在需要的一个状态。
碎片输出的是当前的 fragment 函数在这个像素点的颜色,并不代表这像素点的最终颜色。最后显示的颜色是这个点的所有碎片经过叠加等运算形成的最终结果。
针对 3D 对象进行操作、并被 GPU 所执行的程序。
Shader的分类
Shader按管线分类一般分为固定渲染管线与可编程渲染管线。
- 固定渲染管线——这是标准的几何&光照(Transforming&Lighting)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控制和纹理混合。T&L管线可以被渲染状态控制,矩阵、光照和材质参数。功能比较有限。基本所有的显卡都能正常运行。
- 可编程渲染管线——对渲染管线中的顶点运算和像素运算分别进行编程处理,而无需像固定渲染管线那样套用一些固定函数,取代设置参数来控制管线。
Unity 中的三种自定义 Shader:(参照帮助文档 Shader Reference)
-
surface shaders, 表面着色器(之前默认创建的 Shader 类 型 ) 它是 vertex and fragment shaders 的包装,让我们可以不用去关心这些顶点和片段程序的细节,可以直接得到我们想要的着色器。
-
vertex and fragment shaders 顶点和片元着色器
-
fixed function shaders. 固定功能管线着色器,在可编程渲染管线硬件出现之前,很多光照都会放在硬件级处理(可理解为对固定管线硬件的操作),一般在项目前对绝大多数硬件都可支持,应用就可以使用,比如光照、纹理采样先从 Shaderlab 基本语法开始入手 ,再去阅读surface shaders, 或者vertex and fragment shaders。
vertex and fragment shaders顶点和片元着色器是ShaderLab中的语言片段,不仅可应用在ShaderLab,也可通过CG或者GLSL、HLSL 进行编写,但fixed function shaders固定功能管线着色器必须在ShaderLab中进行编写。
ShaderLab 基本结构
shaderLab手册:https://docs.unity.cn/cn/2023.2/Manual/SL-Shader.html
Unity 中的 Shader 都是要通过 ShaderLab 的基本语法进行编写,unity 就是想通过 Shaderlab 的方案进行 Shader 的 编写。将三种定义的 Shader 通过同一种格式进行编写,避免不同 Shader 使用不同的语法。
//伪代码
Shader “name”
{
Properties//属性
查看ShaderLab:Properties的作用,在可视化面板提供美工可使用的属性
SubShaders//shader 算法
查看 ShaderReference ShaderLab 中最少有一个 SubShader 也可以多个,
与 可以连续使用多个if语句 类似
FallBack//后退
一般会填写所有硬件都支持的渲染方式
}
关于 SubShaders(处理 ShaderLab 中的语言片段) 在 ShaderLab 中至少有一个 SubShader,当然也可多个。 但是,显卡每次渲染处理的时候只能选择一个 SubShaders 执行。那多个 SubShader 的作用是为了不同硬件的渲染支持,为了 Shader 能在比较老的图形显卡中也能支持。一般比较越往下的 SubShader 要简化,运算指令要简单。
-
Fixed function shader 固定功能管
所有硬件平台都可支持,针对硬件能够执行的基本命令的 Shader,当然,功能有限,但是,速度最快。
Properties 属性
Material 材质
Lighting 光照
Settexture 设置纹理
Pass 通道(存储图像的色彩)
-
surface shaders
surfaceOutput 输出
Input 输入
Lighting 光
VS插件
位置:VS-扩展-管理扩展-ShaderlabVS插件
只是为了更方便的写代码,不安装也可以。
创建自己的Shader,以 Sphere球 为例
- 创建一个物体(比如一个Sphere(球))。
- 创建一个Material(材质)挂载到Sphere。
- 创建一个Standard Surface Shader挂载到Sphere。
效果:
代码:
Shader "Custom/MyShader01"
{
Properties//属性
{
// "_" 在其它语规范中表示一个私有变量
//_Color 理解为变量名
//MyColor会显示在inspector面板中
//inspector面板中的属性名可以是中文也可以是英文 颜色 MyColor
_Color("颜色",color) = (1,0,0,1)
_Ambient("环境光",color) = (1,0,0,1)
_Specular("高光反射",color) = (1,0,0,1)
_Shininess("亮度",range(0,8)) = 3//range是float类型
_emission("自发光",color) = (1,0,0,1)
_mainTexture("纹理",2D) = "white"{}
}
SubShader
{
Pass//通道
{
//color(1,0,0,1)//() 指 固定值
color[_Color]//[] 指 参数值
Material//材质
{
//漫反射(必须依靠光照,将光打在物体表面反射光,我们才能看到物体)
Diffuse[_Color]
//环境光
ambient[_Ambient]
//高光反射系数
specular[_Specular]
//滑动条
shininess[_Shininess]
//自发光
emission[_emission]
}
lighting on//启动光照
separateSpecular on//启动高光
setTexture[_mainTexture]//设置纹理
{
//纹理
//因为纹理比较暗,所以添加 double
combine Texture*primary double
}
}
}
//FallBack "Diffuse"
}
注:shader不区分大小写。
surface shader example官方手册:https://docs.unity3d.com/cn/current/Manual/SL-SurfaceShaderExamples.html,其中有一些常用shader的演示。