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

目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:Shader Compilation Target Levels
版本:2019.1

Shader Compilation Target Levels

着色器编译目标级别

当编写Surface Shaders表面着色器或常规Shader Programs着色器程序时,HLSL源代码可以编译成不同的“着色器模型”。为了允许使用更现代的GPU功能,您必须使用更高的着色器编译目标。

注意:使用更高的着色器编译目标,可能使着色器不能在旧的GPU或平台上工作。

指定编译目标通过使用 #pragma target name 指令或是指定 #pragma require feature 指令。例如:

#pragma target 3.5
#pragma require integers 2darray instancing

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

See Also

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值