引言
高层着色语言(HLSL)是DirectX® 9最为强力的新组件之一。使用这种标准的高级语言, 在进行着色时编写者可以专注于算法而不用再去理会诸如寄存器的分配,寄存器读端口限制, 并行处理指令等等硬件细节. 除了把开发者从硬件细节中解放出来之外,HLSL 也具有高级语言所有的全部优势,诸如:代码重用容易, 可读性增强以及存在一个优化过的编译器。本书和 ShaderX2 - Shader Tips & Tricks 这本书的许多章节就用到了HLSL编写的着色器. 阅读完本章引言后,你会很容易理解那些着色器并在工作中用到它们。
这一章, 我们概述语言本身的基本结构以及将HLSL集成到你的应用程序中的方法。
一个简单的示例
在彻底描述HLSL之前, 让我们先看一下程序中HLSL顶点着色和HLSL像素着色的实现,这个程序渲染简单的木纹。下边显示的第一个HLSL着色是一个简单的顶点着色:
float4x4 view_proj_matrix; float4x4 texture_matrix0; struct VS_OUTPUT { float4 Pos : POSITION; float3 Pshade : TEXCOORD0; }; VS_OUTPUT main (float4 vPosition : POSITION) { VS_OUTPUT Out = (VS_OUTPUT) 0; // Transform position to clip space Out.Pos = mul (view_proj_matrix, vPosition); // Transform Pshade Out.Pshade = mul (texture_matrix0, vPosition); return Out; }
最开始两行声明了一对4×4的矩阵,分别命名为view_proj_matrix和texture_matrix0。在全局矩阵之后,声明了一个结构体。这个VS_OUTPUT
有两个成员:Pos和Pshade。
该着色器的main函数接受一个单精度float4类型的输入参数并返回一个VS_OUTPUT结构体。float4类型的vPosition是着色器唯一的输入,返回的VS_OUTPUT结构体定义了 该顶点着色器的输出。目前不必关心在参数和结构体之后的关键字POSITION和TEXCOORD0。它们被称为语义,他们的含义将在本章后边讨论。
看一下main函数的实际代码部分,你可以看到一个内部函数mul,它被用来把输入的向量vPosition和矩阵view_proj_matrix相乘。在顶点着色器中这个函数最常被用来执行顶点-矩阵的乘法。就这样,vPosition被作为列向量,因为它是mul的第二个参数。如果向量vPosition是mul的第一个参数,它将被作为行向量。内部函数mul以及其