UnityShader
前言
- 资料
1、UNITY SHADER入门精要 冯乐乐著 北京:人民邮电出版社_P370_2016.06
第2章 渲染流水线
draw call
- 顶点着色器 vertex shader
- CPU输入
- 每个顶点调一次顶点着色器
- 顶点间关系不可知,相互独立,GPU并行处理,速度快
- 坐标转换、逐顶点光照
- 把顶点坐标从模型空间转换到齐次裁剪空间,硬件透视除法->设备坐标
- z分量范围,OpenGL[-1,1],DirectX[0,1]
- 输出->片元着色器。现代Shader Model,曲面细分着色器或几何着色器
- 片元着色器 fragment shader 完全可编程
- 逐片元操作 改颜色、深度缓冲、混合,不可编程,高可配置性
- 曲面细分着色器 tesselation shader
- 几何着色器 geometry shader
- 光栅化概念阶段 三角形设置Triangle Setup和三角形遍历Triangle Traversal,固定函数
- 不影响屏幕像素颜色值,只产生一系列数据。
- [顶点着色器] 阶段一
- [裁剪] 图元部分在视野外,视野边界相交处生成新顶点。不可编程,可配置操作
- [屏幕映射] 不对z坐标处理,屏幕坐标系+z坐标->窗口坐标系,值传于光栅化阶段
- [三角形设置] ·计算每个图元覆盖的像素 ·计算像素的颜色
- 输入-> 屏幕坐标系顶点位置、额外信息(深度值(z坐标)、法线方向、视角方向…)
- 计算三角形每条边上的像素坐标
- [三角形遍历] 亦称:扫描变换Scan Conversion。
- 每个像素被一个三角网格覆盖,生成一个片元fragment。
- 片元,存储数据。
- 输出-> 片元序列,一个片元包含状态的集合(屏幕坐标、深度、法线、纹理坐标)
- [片元着色器FragmentShader] DirectX中称为:像素着色器PixelShader
- 输入-> 上一阶段,顶点着色器中输出的数据差值,(1)一个或多个颜色值
(2)顶点纹理坐标,光栅化对纹理坐标进行插值 - 纹理采样…
- 输入-> 上一阶段,顶点着色器中输出的数据差值,(1)一个或多个颜色值
- [逐片元操作Per-FragmentOperations] DirectX中:输出合并阶段Output-Merger
- 片元->模板测试->深度测试->混合->颜色缓冲区
- 操作:
(1)决定片元可见性。深度测试、模板测试…
(2)通过测试,将片元颜色值与已存于缓冲区的颜色合并 - 双重缓存DoubleBuffering:
(1)场景渲染在幕后发生,在后置缓冲BackBuffer中。
(2)渲染完成与前置缓冲FrontBuffer,存放原显示在屏幕的图像,内容交换 - 混合Blend:
(1)关闭,则片元着色器计算出的颜色值会直接覆盖颜色缓冲区中的,做不出半透明效果
-
屏幕坐标差异,图像倒转的可能原因
- OpenGL 屏幕左下角当作最小窗口坐标
DirectX 左上角
- OpenGL 屏幕左下角当作最小窗口坐标
-
显卡驱动,相当于显卡的操作系统。
-
着色语言ShadingLanguage
- DirectX HLSL(HighLevelShadingLanguage)
OpenGL GLSL(OpenGLShadingLanguage)
NVIDIA CG(CforGraphic) - 编译成与机器无关的汇编语言,中间语言(IntermediateLanguage, IL)
- DirectX HLSL(HighLevelShadingLanguage)
第3章 UnityShader
- 本质:一个文本文件
- 材质Material + UnityShader
- 结合GameObject的Mesh或ParticleSystems组件来工作
- UnityShader模板:
- Standard Surface shader:标准光照模型表面着色器
- Unlit Shader:不含光照,含雾效,顶点/片元着色器
- Image Effect shader:实现屏幕后处理效果的基础模板
- Compute Shader:特殊shader文件,利用GPU的并行性进行与常规渲染流水线无关的计算
-
Properties语义块
- 访问属性,需在CG代码片定义与属性类型相匹配的变量。不在Properties声明属性,也可在CG直接定义变量。
- 作用:让声明的属性可以出现在材质面板中
- Properties语义块支持的属性类型
属性类型 默认值的定义语法 例子 Int number _Int(“Int”, Int) = 2 Float number _Float(“Float”, Float) = 1.5 Range(min,max) number _Range(“Range”, Range(0.0, 5.0)) = 3.0 Color (number,number,number,number) _Color(“Color”, Color) = (1,1,1,1) Vector (number,number,number,number) _Vector(“Vector”, Vector) = (1,1,1,1) 2D “defaulttexture”{} _2D(“2D”, 2D) = “”{} Cube “defaulttexture”{} _Cube(“Cube”, Cube) = “wihte”{} 3D “defaulttexture”{} _3D(“3D”, 3D) = “wihte”{} Shader "Custom/ShaderLabProperties" { Properties { // Numbers and Sliders _Int ("Int", Int) = 2 _Range ("Range", Range(0.0, 5.0)) = 2.0 // Colors and Vectors _Color ("Color", Color) = (1,1,1,1) _Vector ("Vector", Vector) = (1,1,1,1) //Textures _2D ("2D", 2D) = ""{} _Cube ("Cube", Cube) = "white"{} } }
-
SubShader语义块
-
可有多个,至少需一个。不同的显卡具有不同的能力。
-
扫描所以SubShader,选择第一个能够在目标平台上运行的。都不支持,则使用Fallback语义指定的UnityShader。
-
字段
- Pass 定义一次完整的渲染流程。数目过多,渲染性能下降。
- RenderSetup [可选] 状态,可Pass中声明,SubShader中声明则用于所有Pass,因语法相同。
- Tags [可选] 标签,可Pass中声明,SubShader中某些是特定的,不一样。
-
常见的渲染状态设置选项
状态名称 设置命令 解释 Cull CullBack/Front/Off 设置剔除模式:剔除背面/正面/关闭 ZTest Ztest Lest Greater/LEqual/GEqual/NotEqual/Always 设置深度测试时使用的函数 ZWrite ZWriter On/Off 开启/关闭深度写入 Blend Blend SrcFactor DstFator 开启并设置混合模式 -
SubShader的标签
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
- 键值对(Key/Value Pair),字符串类型
- SubShader与渲染引擎之间的沟通桥梁
- SubShader的标签类型
标签类型 说明 例子 Queue 控制渲染顺序,指定该物体属于哪个渲染队列。可用于保证所有透明物体在所有不透明物体后面被渲染。 Tags{“Queue” = “Transparent”} RenderType 对着色器分类,例如这是不透明,或透明的着色器等。可用于着色器替换(Shader Replacement)功能 Tags{“RenderType” = “Opaque”} DisableBatching 是否使用批处理。一些SubShader使用Unity的批处理时出现问题,例如使用了模型空间下的坐标进行顶点动画。 Tags{“DisableBatching” = “True”} ForceNoShadowCasting 控制使用该SubShader的物体是否投射阴影 Tags{“ForceNoShadowCasting” = “True”}
-