shader first
来源:互联网 发布:震撼人心的照片知乎 编辑:程序博客网 时间:2024/05/16 08:28
SubShader和显卡的兼容性判断,和SubShader的标签、Pass的标签和显卡支持的“Unity渲染路径”有关。这些都会在下面逐一提到。
SubShader的Tag
Shader "ShaderLab Tutorials/TestShader" { SubShader { Tags { "Queue"="Geometry+10" "RenderType"="Opaque" } //... }}
SubShader内部可以有标签(Tags)的定义。Tag指定了这个SubShader的渲染顺序(时机),以及其他的一些设置。"Queue"
标签。定义渲染顺序。预制的值为"Background"
。值为1000。比如用于天空盒。"Geometry"
。值为2000。大部分物体在这个队列。不透明的物体也在这里。这个队列内部的物体的渲染顺序会有进一步的优化(应该是从近到远,early-z test可以剔除不需经过FS处理的片元)。其他队列的物体都是按空间位置的从远到近进行渲染。"AlphaTest"
。值为2450。已进行AlphaTest的物体在这个队列。"Transparent"
。值为3000。透明物体。"Overlay"
。值为4000。比如镜头光晕。- 用户可以定义任意值,比如
"Queue"="Geometry+10"
"RenderType"
标签。Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader
或者Camera.SetReplacementShader
配合使用。Unity内置的RenderType包括:"Opaque"
:绝大部分不透明的物体都使用这个;"Transparent"
:绝大部分透明的物体、包括粒子特效都使用这个;"Background"
:天空盒都使用这个;"Overlay"
:GUI、镜头光晕都使用这个;- 还有其他可参考Rendering with Replaced Shaders;用户也可以定义任意自己的RenderType字符串。
"ForceNoShadowCasting"
,值为"true"
时,表示不接受阴影。"IgnoreProjector"
,值为"true"
时,表示不接受Projector组件的投影。Pass
Shader "ShaderLab Tutorials/TestShader" { SubShader { Pass { //... } }}
一个SubShader(渲染方案)是由一个个Pass块来执行的。每个Pass都会消耗对应的一个DrawCall。在满足渲染效果的情况下尽可能地减少Pass的数量。
一个SubShader(渲染方案)是由一个个Pass块来执行的。每个Pass都会消耗对应的一个DrawCall。在满足渲染效果的情况下尽可能地减少Pass的数量。
Pass的Tag
Shader "ShaderLab Tutorials/TestShader" { SubShader { Pass { Tags{ "LightMode"="ForwardBase" } //... } }}
和SubShader有自己专属的Tag类似,Pass也有Pass专属的Tag。
其中最重要Tag是 "LightMode"
,指定Pass和Unity的哪一种渲染路径(“Rendering Path”)搭配使用。这里需要描述的Tag取值可包括:
Always
,永远都渲染,但不处理光照ShadowCaster
,用于渲染产生阴影的物体ShadowCollector
,用于收集物体阴影到屏幕坐标Buff里。
其他渲染路径相关的Tag详见下面章节“Unity渲染路径种类”。
具体所有Tag取值,可参考ShaderLab syntax: Pass Tags。
FallBack
Shader "ShaderLab Tutorials/TestShader"{ SubShader { Pass {} } FallBack "Diffuse" // "Diffuse"即Unity预制的固有Shader // FallBack Off //将关闭FallBack}
当本Shader的所有SubShader都不支持当前显卡,就会使用FallBack语句指定的另一个Shader。FallBack最好指定Unity自己预制的Shader实现,因其一般能够在当前所有显卡运行。
Properties
Shader "ShaderLab Tutorials/TestShader"{ Properties { _Range ("My Range", Range (0.02,0.15)) = 0.07 // sliders _Color ("My Color", Color) = (.34, .85, .92, 1) // color _2D ("My Texture 2D", 2D) = "" {} // textures _Rect("My Rectangle", Rect) = "name" { } _Cube ("My Cubemap", Cube) = "name" { } _Float ("My Float", Float) = 1 _Vector ("My Vector", Vector) = (1,2,3,4) } // Shader SubShader{ Pass{ //... uniform float4 _Color; //... float4 frag() : COLOR{ return fixed4(_Color); } //... } } //fixed pipeline SubShader { Pass{ Color[_Color] } }}
Material
的接口(比如SetFloat
、SetTexture
编辑)[name]
(固定管线)或直接name
(可编程Shader)访问这些属性。Shader中的数据类型
有3种基本数值类型:float
、half
和fixed
。
这3种基本数值类型可以再组成vector和matrix,比如half3
是由3个half
组成、float4x4
是由16个float
组成。
float
:32位高精度浮点数。half
:16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后3.3位。fixed
:11位低精度浮点数。范围是[-2, 2],精度是1/256。
数据类型影响性能
- 精度够用就好。
- 颜色和单位向量,使用
fixed
- 其他情况,尽量使用
half
(即范围在[-6万, +6万]内、精确到小数点后3.3位);否则才使用float
。
- 颜色和单位向量,使用
- 不要将低精度
fixed
类型转换为更高的精度,否则会产生性能问题。 - 低精度
fixed
不要使用“swizzle”(即形如myFixed4.xyzw
、myFixed2.xyxy
,中文不知咋译,“搅和
访问”?),否则会产生性能问题。
Shader形态
Shader形态之1:固定管线
固定管线是为了兼容老式显卡。都是顶点光照。之后固定管线可能是被Unity抛弃的功能,所以最好不学它、当它不存在。特征是里面出现了形如下面Material
块、没有CGPROGRAM
和ENDCG
块。
Shader "ShaderLab Tutorials/TestShader"{ Properties { _Color ("My Color", Color) = (.34, .85, .92, 1) // color } // Fixed Pipeline SubShader { Pass { Material{ Diffuse [_Color] Ambient [_Color] } Lighting On } }}
Shader形态之2:可编程Shader
Shader "ShaderLab Tutorials/TestShader"{ Properties {} SubShader { Pass { // ... the usual pass state setup ... CGPROGRAM // compilation directives for this snippet, e.g.: #pragma vertex vert #pragma fragment frag // the Cg/HLSL code itself float4 vert(float4 v:POSITION) : SV_POSITION{ return mul(UNITY_MATRIX_MVP, v); } float4 frag() : COLOR{ return fixed4(1.0, 0.0, 0.0, 1.0); } ENDCG // ... the rest of pass setup ... } }}
- 功能最强大、最自由的形态。
- 特征是在Pass里出现
CGPROGRAM
和ENDCG
块 - 编译指令
#pragma
。详见官网Cg snippets。其中重要的包括:
编译指令 示例/含义 #pragma vertex name
#pragma fragment name
替换name,来指定Vertex Shader函数、Fragment Shader函数。#pragma target name
替换name(为2.0
、3.0
等)。设置编译目标shader model的版本。#pragma only_renderers name name ...
#pragma exclude_renderers name name...
#pragma only_renderers gles gles3
,#pragma exclude_renderers d3d9 d3d11 opengl
,
只为指定渲染平台(render platform)编译- 引用库。通过形如
#include "UnityCG.cginc"
引入指定的库。常用的就是UnityCG.cginc
了。其他库详见官网Built-in shader include files。 - ShaderLab内置值。Unity给Shader程序提供了便捷的、常用的值,比如下面例子中的
UNITY_MATRIX_MVP
就代表了这个时刻的MVP矩阵。详见官网ShaderLab built-in values。
CC_MVPMatrix的作用
CC_MVPMatrix本质上是一个变换矩阵,用来把一个世界坐标系中的点转换到Clipping space。当然,如果学过OpenGL的人都知道,3D物体从建模到最终显示到屏幕上面要经历以下几个阶段:
- 对象空间(Object Space)
- 世界空间(World Space)
- 照相机空间(Camera Space)
- 裁剪空间(Clipping Space)
- 视口空间(Viewport)
COLOR
、SV_Position
、TEXCOORD[n]
。完整的参数语义可见HLSL Semantic(由于是HLSL的连接,所以可能不完全在Unity里可以使用)。- shader first
- Shader First
- shader
- shader
- shader
- Shader
- Shader
- shader
- shader
- shader
- Shader
- shader
- Shader
- shader
- Shader
- shader
- Shader
- Shader
- hashset,treeset,hashmap,treemap的区别
- WOT2016卢学裕:小团队如何玩转大数据
- 剑指Offer——翻转英文句子中的单词顺序
- 软件工程师的视角看网络(网络那点事)
- Linux中iptables设置详细
- shader first
- Ehcache(04)——设置缓存的大小
- Des 加密算法
- Linux的进程/线程间通信方式总结 04
- 遍历数组时移除数组中元素造成程序崩
- Ehcache(05)——缓存的查询
- I,P,B帧和PTS,DTS的关系,GOP相关
- LeetCode/Vector创建二维数组及vector元素的函数的使用方法
- python学习4