ShaderX2翻译一 连载中
Introdudion
一个DirectX 9 最新的组件是HLSL(high level shading language).使用这个标准语言,着色器编写者能够投入到算法中而不用担心硬件细节,就如寄存器分配,寄存器读取端口限制,命令问题等等.并且从硬件细节中解放开发.HLSL拥有所有高级语言的普通优点,比如简单的代码复用,改良过的可读性,和优化的编译器.在这本书中的一些章节中我们利用的着色器是用HLSL写的.因此,你很容易理解和使用着色器来渲染物体.
在这章,我们概述基本的语言结构,并且整合HLSL着色器到你的程序中.
A Simple Example
在描述HLSL前,让我们看看一个HLSL的顶点着色器和一个HLSL的像素着色器,下面是一个简单的顶点着色器
float4x4 víew_proj_matríx;
float4x4 texture_matríx0;
struct VS _OUTPUT
float4 Pos : POSITION;
float3 Pshade : TEXCOORDO;
VS OUTPUT maín (float4 vPosítíon : POSITION) VS OUTPUT Out = (VS OUTPUT) 0;
// Transform posítíon to clíp space
Out.Pos = mul (view_proj_matríx vPosítíon);
// Transform Pshade
Out.Pshade = mul (texture_matríx0 vPosítíon);
return Out;
开始的两行声明一对4x4的矩阵分别为view_proj_matrix 和texture_matrix0明之后一个结构体被声明.VS_OUTPUT结构体有两个成员:一个float4 类型的是Pos 和一个float3类型是Pshade.
该着色器的主函数中有一个简单的float4输入参数和一个VS_OUTPUT类型的返回值.float4类型的vPosition是着色器唯一的输入参数.返回VS_OUTPUT结构体被定义为顶点着色器的输出.目前不用担心参数和结构体之后关键字POSITION和TEXCOORD0.
这些是semantics(语义),他的意思在这章后面讨论
Looking at 目前的主函数代码,你能看到输入的vPosition向量被view_proj_matrix矩阵相乘利用内部函数mul.该函数在顶点着色器中被使用来执行顶点-矩阵相乘.如果vPosition是mul的第二个参数,vPosition 被处理为一个纵列向量,如果Position向量是mul的第一个参数,他将会处理为行向量.(mul函数和其他的内部函数会在这章详细的讨论.)然后Position被另一个矩阵texture_matrix0相乘,形成3D纹理坐标.这两个变化会被写入VS_OUTPUT结构体中然后被return.一个顶点着色器必须至少输出一个齐次裁剪空间坐标.任何从顶点着色器输出的变量会经过光栅化后能够作为像素着色器的输入.因此,3DPshade会从通过顶点着色器到像素着色器.
下面我们看到一个简单的HLSL像素着色器.该像素着色器工作在上面的顶点着色器上,他将会被编译为ps_2_0目标文件.
float4 lightWood; // xyz == Light Wood Color
float4 darkWood; // xyz == Dark Wood Color
float ringFreq; // ring frequency
sampler PulseTrainSampler;
float4 hlsl_rings (float4 Pshade : TEXCOORD0) : COLOR
{
float scaledDistFromZAxis = sqrt(dot(Pshade.xy, Pshade.xy)) * ringFreq;//得到纹理坐标
float blendFactor = tex1D (PulseTrainSampler, scaledDistFromZAxis);//根据纹理坐标渲染纹理
return lerp (darkWood, lightWood, blendFactor);//线性插值
}
最开始的几行声明了一对float-point4元变量和一个float类型的全局变量,这些变量之后sampler(采样器)类型的变量 PulseTrainSampler被声明.采样器会在这章后面详细讨论.但现在你可以把采样器想成一个被各种状态定义联系着的模式.撇开变量和采样器的声明,我们可以关注着色器主体代码.你能看到有一个输入参数Pshade, 当经过每个顶点时,Pshade会被上面的顶点着色器计算.在像素着色器中像素着色器必须至少返回一个4D RGBA颜色的值.我们将会在这章后面谈论其他的像素着色器输出
浙公网安备 33010602011771号