高级着色器语言
高级着色器语言(即 HLSL,缩写自 High Level Shader Language[1] 或 High-Level Shading Language[2]),是由微软拥有及开发的一种着色器语言,最初的开发是为了辅助 Direct3D 9 的着色器汇编语言,后成为 Direct3D 10 以来统一着色器模型所必须的语言。
HLSL只能供微软的Direct3D以及XNA使用。HLSL是GLSL的先辈,不能与OpenGL标准兼容。它跟Nvidia的Cg非常相似,是因为两个开发者曾经紧密合作。[3]
HLSL的主要作用为将一些复杂的图像处理,快速而又有效率地在显示卡上完成,与组合式或低阶Shader Language相比,能降低在编写复杂特殊效果时所发生编程错误的机会。
Shader model 比较
Pixel shader 比较
Pixel shader 版本 | 1.0 to 1.3[4] | 1.4[4] | 2.0[4][5] | 2.0a[4][5] | 2.0b[4][5] | 3.0[4][6] | 4.0[7] | 4.1[8] | 5.0[9] |
---|---|---|---|---|---|---|---|---|---|
Dependent texture limit | 4 | 6 | 8 | Unlimited | 8 | Unlimited | Unlimited | Unlimited | Unlimited |
Texture instruction limit | 4 | 6*2 | 32 | Unlimited | Unlimited | Unlimited | Unlimited | Unlimited | Unlimited |
Position register | No | No | No | No | No | Yes | Yes | Yes | Yes |
Instruction slots | 8+4 | 8+4 | 32 + 64 | 512 | 512 | ≥ 512 | ≥ 65536 | ≥ 65536 | ≥ 65536 |
Executed instructions | 8+4 | 6*2+8*2 | 32 + 64 | 512 | 512 | 65536 | Unlimited | Unlimited | Unlimited |
Texture indirections | 4 | 4 | 4 | Unlimited | 4 | Unlimited | Unlimited | Unlimited | Unlimited |
Interpolated registers | 2 + 8 | 2 + 8 | 2 + 8 | 2 + 8 | 2 + 8 | 10 | 32 | 32 | 32 |
Instruction predication | No | No | No | Yes | No | Yes | No | No | No |
Index input registers | No | No | No | No | No | Yes | Yes | Yes | Yes |
Temp registers | 2 | 6 | 12 to 32 | 22 | 32 | 32 | 4096 | 4096 | 4096 |
Constant registers | 8 | 8 | 32 | 32 | 32 | 224 | 16x4096 | 16x4096 | 16x4096 |
Arbitrary swizzling | No | No | No | Yes | No | Yes | Yes | Yes | Yes |
Gradient instructions | No | No | No | Yes | No | Yes | Yes | Yes | Yes |
Loop count register | No | No | No | No | No | Yes | Yes | Yes | Yes |
Face register (2-sided lighting) | No | No | No | No | No | Yes | Yes | Yes | Yes |
Dynamic flow control | No | No | No | No | No | 24 | Yes | Yes | Yes |
Bitwise Operators | No | No | No | No | No | No | Yes | Yes | Yes |
Native Integers | No | No | No | No | No | No | Yes | Yes | Yes |
- PS 2.0 = DirectX 9.0 original Shader Model 2 specification.
- PS 2.0a = NVIDIA GeForce FX-optimized model.
- PS 2.0b = ATI Radeon X700, X800, X850 shader model, DirectX 9.0b.
- PS 3.0 = Shader Model 3.0.
- PS 4.0 = Shader Model 4.0.
- PS 4.1 = Shader Model 4.1.
- PS 5.0 = Shader Model 5.0.
"32 + 64" for Executed Instructions means "32 texture instructions and 64 arithmetic instructions."
Vertex shader 比较
Vertex shader 版本 | VS 1.1[10] | VS 2.0[5][10] | VS 2.0a[5][10] | VS 3.0[6][10] | VS 4.0[7] | VS 4.1[11] | VS 5.0[9] |
---|---|---|---|---|---|---|---|
# of instruction slots | 128 | 256 | 256 | ≥ 512 | 4096 | 4096 | 4096 |
Max # of instructions executed | Unknown | 65536 | 65536 | 65536 | 65536 | 65536 | 65536 |
Instruction predication | No | No | Yes | Yes | Yes | Yes | Yes |
Temp registers | 12 | 12 | 13 | 32 | 4096 | 4096 | 4096 |
# constant registers | ≥ 96 | ≥ 256 | ≥ 256 | ≥ 256 | 16x4096 | 16x4096 | 16x4096 |
Static flow control | ??? | Yes | Yes | Yes | Yes | Yes | Yes |
Dynamic flow control | No | No | Yes | Yes | Yes | Yes | Yes |
Dynamic flow control depth | No | No | 24 | 24 | Yes | Yes | Yes |
Vertex texture fetch | No | No | No | Yes | Yes | Yes | Yes |
# of texture samplers | N/A | N/A | N/A | 4 | 128 | 128 | 128 |
Geometry instancing support | No | No | No | Yes | Yes | Yes | Yes |
Bitwise operators | No | No | No | No | Yes | Yes | Yes |
Native integers | No | No | No | No | Yes | Yes | Yes |
- VS 2.0 = DirectX 9.0 original Shader Model 2 specification.
- VS 2.0a = NVIDIA GeForce FX-optimized model.
- VS 3.0 = Shader Model 3.0.
- Note that ATI X1000 series cards (e.g. X1900) does not support Vertex Texture Fetch, hence it does not fully comply with the VS 3.0 model. Instead, they offer a feature called "Render to Vertex Buffer (R2VB)" that provides functionality that is a superset of Vertex Texture Fetch.[12]
- VS 4.0 = Shader Model 4.0.
- VS 4.1 = Shader Model 4.1.
- VS 5.0 = Shader Model 5.0.
范例
- 灰阶贴图用
- 灰阶值 = 0.3 x 红 + 0.59 x 绿 + 0.11 x 蓝
sampler2D Texture0;
float4 ps_main( float2 texCoord : TEXCOORD0 ) : COLOR
{
float4 _inColor = tex2D( Texture0, texCoord );
float gray = 0.3*_inColor.x + 0.59*_inColor.y + 0.11*_inColor.z;
float4 _outColor = float4(gray, gray, gray, 1.0);
return _outColor;
}
注释
- ^ Writing HLSL Shaders in Direct3D 9 (Windows). msdn.microsoft.com. [2018-06-25]. (原始内容存档于2018-06-25).
- ^ HLSL. MSDN. Microsoft. [5 January 2015]. (原始内容存档于2018-06-25).
- ^ Fusion Industries :: Cg and HLSL FAQ ::. 24 August 2012. (原始内容存档于24 August 2012).
- ^ 4.0 4.1 4.2 4.3 4.4 4.5 Pixel Shader Differences. msdn.microsoft.com. 2011-02-08 [2014-08-28]. (原始内容存档于2013-03-16).
- ^ 5.0 5.1 5.2 5.3 5.4 Peeper, Craig. Microsoft DirectX High Level Shader Language (HLSL) (PPT). microsoft.com: 5–8, 24–25. 2004-03-15.[永久失效链接]
- ^ 6.0 6.1 Shader Model 3.0, Ashu Rege, NVIDIA Developer Technology Group, 2004.
- ^ 7.0 7.1 The Direct3D 10 System, David Blythe, Microsoft Corporation, 2006.
- ^ 存档副本. [2014-08-28]. (原始内容存档于2015-12-01).
- ^ 9.0 9.1 存档副本. [2014-08-28]. (原始内容存档于2013-09-09).
- ^ 10.0 10.1 10.2 10.3 Vertex Shader Differences. msdn.microsoft.com. 2011-02-08 [2014-08-28]. (原始内容存档于2013-03-14).
- ^ 存档副本. [2014-08-28]. (原始内容存档于2014-05-16).
- ^ Radeon X1000 series lacks vertex texture fetch[1] (页面存档备份,存于互联网档案馆)