Shader Compilation Target Levels
着色器编译目标级别
当编写Surface Shaders表面着色器或常规Shader Programs着色器程序时,HLSL源代码可以编译成不同的“着色器模型”。为了允许使用更现代的GPU功能,您必须使用更高的着色器编译目标。
注意:使用更高的着色器编译目标,可能使着色器不能在旧的GPU或平台上工作。
指定编译目标通过使用#pragma targetname指令或是指定#pragma requirefeature指令。例如:
Default copilation target
默认的编译目标
Unity默认将着色器编译成最低支持目标(2.5);介于DirectX着色器模型2.0和3.0之间。其他一些编译指令使着色器自动编译成更高的目标:
使用几何着色器(#pragma geometry)将会设置编译目标为4.0。
使用曲面细分着色器(#pragma hull或pragma domain)将会设置编译目标为4.6。
任何着色器如果没有通过#pragma为几何体、外壳或域着色器明确的设置函数入口点,都将降低内部着色器的能力要求。这将让着色器在更多的非DX11平台都可以兼容工作。
例如,Unity支持在Metal图形平台上曲面细分着色器,但Metal不支持几何着色器。使用#pragma target t.0还是有效的,只要你不使用几何着色器。
Supported ‘#pragma tarrget’ names
支持的 ‘#pragma target’ names的目标着色器模型
这儿有一些可支持的着色器模型列表,可以提升一些兼容性(在某些情况下需要更高的平台/GPU):
#pragma target 2.0
Unity所有平台都支持。DX9着色器模型2.0。
有限数量的算术和纹理指令;8个插值器;没有顶点阶段纹理采样;片段着色器中没有导数
;没有显式的LOD纹理采样。
#pragma target 2.5(efault)
几乎与3.0 目标模型一样(往下看),除了仍然只有8个插值器,没有显式的LOD纹理采样。
在Windows Phone平台上编译到DX11特性级别9.3的。
#pragma target 3.0
DX9着色器模型3.0:导数指令,LOD纹理采样,10个插值器,更多的数学/纹理指令。
不支持DX11特性界别9.x GPU(例如,多数的Windows Phone设备)。
在一些OpenGL ES 2.0设备不完全支持,这取决于当前的驱动程序扩展和所使用的特性。
#pragma target 3.5(or es3.0)
OpenGL ES 3.0的功能(在D3D平台的DX10 SM4.0,仅仅是没有几何着色器)。
不支持DX11 9.X(WinPhone),OpenGL ES 2.0。
支持DX11+,OpenGL 3.2+,OpenGL ES 3+,Metal,Vulkan,PS4/XB1 游戏主机。
着色器原生整形操作,纹理数组,等。
#pragma target 4.0
DX11 SM 4.0。
不支持DX11 9.X(WinPhone),OpenGL ES 2.0/3.0/3.1,Metal。
支持DX11+,OpenGL 3.2+,OpenGL ES 3.1+AEP,Vulkan,PS4/XB1 游戏主机。拥有几何着色器和所有es3.0目标的。
#pragma target 4.5(or es3.1)
OpenGL ES 3.1的功能(在D3D平台的DX11 SM5.0,仅仅没有曲面细分着色器)。
在SM5.0前不支持DX11,OpenGL 4.3前(例如:Mac),OpenGL ES 2.0/3.0。
支持DX11+SM5.0,OpenGL 4.3+,OpenGL ES 3.1,Metal,Vulkan,PS/XB1 游戏主机。
有用通用计算着色器,司机访问纹理些,原子操作,等。没有几何,曲面细分着色器。
#pragma target 4.6(oor gl4.1)
OpenGL 4.1的功能(在D3D平台的DX11 SM5.0,仅仅没有通用计算着色器)。这基本上是Mac上支持的最高OpenGL。
在SM5.0前不支持DX11,4.1前不支持OpenGL,OpenGL ES 2.0/3.0/3.1,Metal。
支持DX11+SM5.0,OpenGL 4.1+,OpenGL ES 3.1+AEP,Vulkan,Metal(没有几何着色器),PS4/XB1 游戏主机。
#pragma target 5.0
DX11 着色器模型5.0。
在SM5.0前不支持DX11,4.3前不支持OpenGL(例如:Mac),OpenGL ES 2.0/3.0/3.1,Metal。
支持DX11+SM5.0,OpenGL 4.3+,OpenGL ES 3.1+AEP,Vulkan,Metal(没有几何着色器),PS4/XB1 游戏主机。
注意所有OpenGL类平台(包括移动平台的)都将会被看作是“SM3.0”。WP8/WinRT 平台(DX11特性级别9.x)被看作是SM2.5。
Supported ‘#pragma require’ names
支持的’#pragma require’ names
下面是支持的一些#pragma require指令列表:
interpolators10:至少10个顶点到片段的插值器可用。
interpolators15:至少15个。
interpolatoors32:至少32个。
mrt4:多渲染目标,至少4个。
mrt8:多渲染目标,至少8个。
derivatives:像素着色器导数指令(ddx/ddy)。
sampledlod:显式的纹理LOD采样(tex2Dlod / SampleLevel)。
fragcoord:像素着色器中的输入像素定位信息(屏幕上的XY,裁剪空间的ZW深度)
integers:整数是一种实际的数据类型,包括位/移位操作。
2darray:2D纹理数组(Texture2DArray)。
cubearray:Cubemap数组(CubemapArray)。
instancing:SV_InstanceID 将会输入到系统值中(System Value: SV)。
geometry:DX10 几何着色器。
compute:通用计算着色器,结构缓存,原子操作。
randomwrite:“random write”(UAV)纹理。
tesshw:GPU硬件曲面细分的支持,但不需要曲面细分的shader阶段(例如,Metal支持曲面细分,但不是通过shader阶段处理的)。
tessellation:曲面细分 外壳/域 着色器阶段。
msaatex:可以访问多采样纹理(HLSL中的Texture2DMS)。(MS:Multi-Sampled)
sparsetex:带有居住信息的稀疏纹理(这个直译,没动这个是什么,以后再说)("Tier2"项在D3D中支持;CheckAccessFullMapped HLSL函数)。注意当前仅仅在DX11/12有实现。
framebufferfetch:帧缓存抓取 - 可以读取在像素着色器中输入的像素颜色。
多数的#pragma targete指令都是上述要求的缩写 (#pragma require指令集的缩写),它们对应于:
2.5:derivatives(偏导数)
3.0:2.5 + interpolators10 + samplelod + fragcoord(在2.5基础上,添加10个插值器,load采样器,雾化坐标)
3.5:3.0 + interploator15 + mrt4 + integers + 2darray + instancing(3.0上添加15个插值器,4个mrt(multiple render target),整数,2d纹理数组,数据实例)
4.0:3.5 + geometry(3.5上添加了几何着色器)
5.0:4.0 + compute + randomwrite + tesshw + tessellation(4.0上添加通用计算着色器,随机写入,硬件的曲面细分,外壳/域着色器的曲面细分)
4.5:3.5 + compute + randomwrite(3.5上添加通用着色器,随机写入)
4.6:4.0 + cubearray + tesshw +tessellation(4.0上添加cube纹理数组,硬件的曲面细分,外壳/域着色器的曲面细分)
注意在Direct3D的着色器模型4.0也有"mrt8"(8个mrt));着色器5.0有"interpolators32"(32个插值器)和"cubearray"(cube纹理数组)。当时,在多数的移动平台上不保证都是有效可用的。所以需要带上向后兼容的shader,写上 #pragma target 4.0 指令不会自动带上8 MRT的支持,#pragma target 5.0不会自动带上32个插值器,也不会自动带上cubemap数组。