高级着色器语言

高级着色器语言（即 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