高級著色器語言

高階著色器語言（即 HLSL，縮寫自 High Level Shader Language 或 High-Level Shading Language），是由微軟擁有及開發的一種著色器語言，最初的開發是為了輔助 Direct3D 9 的著色器組合語言，後成為 Direct3D 10 以來統一著色器模型所必須的語言。

HLSL只能供微軟的Direct3D以及XNA使用。HLSL是GLSL的先輩，不能與OpenGL標準兼容。它跟Nvidia的Cg非常相似，是因為兩個開發者曾經緊密合作。

HLSL的主要作用為將一些複雜的圖像處理，快速而又有效率地在顯示卡上完成，與組合式或低階Shader Language相比，能降低在編寫複雜特殊效果時所發生編程錯誤的機會。

## Shader model 比較

### Pixel shader 比較

Pixel shader 版本｜1.0 to 1.3｜1.4｜2.0｜2.0a｜2.0b｜3.0｜4.0｜4.1｜5.0

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｜VS 2.0｜VS 2.0a｜VS 3.0｜VS 4.0｜VS 4.1｜VS 5.0

- 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.
- 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 藍

```c
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;
}
```

## 外部連結

- Introduction to the DirectX 9 High-Level Shader Language (MSDN Library)
- HLSL Introduction
- Shader Model Comparison at Beyond3D
- Riemer's HLSL Introduction & Tutorial with lots of sample code