Unity Shader - Shader Compilation Target Levels 着色器编译目标级别

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 hullpragma 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数组。

你可能感兴趣的:(Unity Shader - Shader Compilation Target Levels 着色器编译目标级别)