高級著色器語言
外觀
高級著色器語言(即 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] (頁面存檔備份,存於網際網路檔案館)