无论编写 表面着色器还是其他常规着色器程序时,HLSL资源可以别编译为不同的“着色器模型”。更高的着色器编译器目标允许使用更多现代GPU功能,但是可能造成在老的GPU或者平台上不能正常工作。
编译器目标通过指令 #pragma target
来指定,比如:
#pragma target 3.5
默认的编译器目标
默认情况下,unity将着色器编译为支持最低目标级别(2.5);在DirectX着色器2.0和3.0之间。其他一些编译指令使着色器自动被编译成更高的目标:
- 使用几何着色器来设置编译器目标到4.0(
#pragma geometry
) - 使用镶嵌着色器来设置编译器目标到4.6((
#pragma hull
or#pragma domain
)
支持的#pragma目标名字
下面是支持的着色器模型支持列表,附带了一个简略的能力描述:
#pragma target 2.0
- 在unity所有支持的平台上都能够工作。DX9着色器 model2.0.
- 有限的算法&贴图指令数量;8个插入器;没有顶点贴图取样;没有片段着色器衍生物;没有清晰细节贴图采样
#pragma target 2.5 (default)
- 几乎和3.0一模一样,除却插入器还是只有8个,并且没有清晰细节贴图采样。
- 在Windows Phone上编译成DX11特性级别9.3
#pragma target 3.0
- DX9着色器 model3.0:派生指令,贴图细节采样,10插入器,更多的计算&贴图指令。
- 不支持DX11特性在级别9.x 的GPU上。
- 可能在一些OpenGL ES2.0设备上不会被完全支持,取决于驱动扩展和被使用的特性。
#pragma target 3.5 (or es3.0)
- OpenGL ES3.0级别能力(DX10 SM4.0在D3D平台,只是没有几何着色器)。
- 不支持 DX11 9.x(WinPhone),OpenGL ES 2.0。
- 支持 DX11+, OpenGL 3.2+ ,OpenGL ES3+, Metal ,Vulkan, PS4/XB控制台。
- 原生的整数操作,贴图数组等等。
#pragma target 4.0
- DX11 shader model 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 控制台。
- 拥有几何着色器,并且3.0有的它都有。
#pragma target 4.5 (or es3.1)
- OpenGL ES 3.1级别能力 (DX11 SM5.0 on D3D platforms, 没有镶嵌着色器).
- 不支持DX11 before SM5.0, OpenGL before 4.3 (i.e. Mac), OpenGL ES 2.0/3.0.
- 支持DX11+ SM5.0, OpenGL 4.3+, OpenGL ES 3.1, Metal, Vulkan, PS4/XB1控制台。
- 拥有计算着色器,随机读写贴图,原子学等,没有几何或者镶嵌着色器。
#pragma target 4.6 (or gl4.1)
- OpenGL 4.1 级别能力(DX11 SM5.0 on D3D platforms,没有计算着色器).
- 这基本上是Macs支持的最高的OpenGL级别了。
- 不支持DX11 before SM5.0, OpenGL before 4.1, OpenGL ES 2.0/3.0/3.1, Metal.
- 支持 DX11+ SM5.0, OpenGL 4.1+, OpenGL ES 3.1+AEP, PS4/XB1 等控制台。
#pragma target 5.0
- DX11 shader model 5.0.
- 不支持 DX11 before SM5.0, OpenGL before 4.3 (i.e. Mac), OpenGL ES 2.0/3.0/3.1, Metal.
- 支持 DX11+ SM5.0, OpenGL 4.3+, OpenGL ES 3.1+AEP, Vulkan, PS4/XB1控制台。
注意所有的类似OpenGL的平台(包含移动平台)都被当做“shader model 3.0”来对待。WP8/WinRT平台(DX11特性 level 9.x)都被当做“shader model 2.5”来对待。