## 1.3 变量类型

### 1.3.1 数值类型

HLSL支持下列数值类型scalar type）：

n         bool——Truefalse值。注意，HLSL提供了truefalse关键字

n         int——32位有符号整型

n         half——16位浮点数

n         float——32位浮点数

n         double——64位浮点数

### 1.3.2 向量类型

HLSL有下列内建向量类型vector type）：

n         vector——各分量为float类型的4D向量

n         vector<T, n>——一个n维向量，其每个分量为数值scalar类型Tn维必须在14之间。这里是一个2D double向量：

vector<double, 2> vec2;

vec[i] = 2.0f;

vec.x = vec.r = 1.0f;
vec.y = vec.g = 2.0f;
vec.z = vec.b = 3.0f;
vec.w = vec.a = 4.0f;

float2 vec2;
float3 vec3;
float4 vec4;

vector u = {l.0f, 2.0f, 3.0f, 4.0f};
vector v = {0.0f, 0.0f, 5.0f, 6.0f};

v = u.xyyw; // v = {1.0f, 2.0f, 2.0f, 4.0f}

vector u = {1.0f, 2.0f, 3.0f, 4.0f};
vector v = {0.0f, 0.0f, 5.0f, 6.0f};

v.xy = u; // v = {l.0f, 2.0f, 5.0f, 6.0f}

### 1.3.3 矩阵类型

HLSL有下列内建矩阵类型：

n         matrix——一个4×4矩阵，其各项类型为float

n         matrix<T, m, n>——一个m×n矩阵，其各项类型为数值类型T。矩阵维数mn必须在14之间。这里是一个2×2整型矩阵的例子：

matrix<int, 2, 2> m2x2;

floatmxn matmxn;

float2x2 mat2x2;
float3x3 mat3x3;
float4x4 mat4x4;
float2x4 mat2x4;

int2x2 i2x2;
int2x2 i3x3;
int2x2 i2x4;

M[i] [j] = value;

1为基数的：

M._11 = M._12 = M._13 = M._14 = 0.0f;
M._21 = M._22 = M._23 = M._24 = 0.0f;
M._31 = M._32 = M._33 = M._34 = 0.0f;
M._41 = M._42 = M._43 = M._44 = 0.0f;

0为基数的：

M._m00 = M._m01 = M._m02 = M._m03 = 0.0f;
M._m10 = M._m11 = M._m12 = M._m13 = 0.0f;
M._m20 = M._m21 = M._m22 = M._m23 = 0.0f;
M._m30 = M._m31 = M._m32 = M._m33 = 0.0f;

vector ithRow = M[i]; // get the ith row vector in M

vector u = {0.6f, 0.3f, 1.0f, 1.0f};
vector v = {1.0f, 5.0f, 0.2f, 1.0f};

vector u = vector(0.6f, 0.3f, 1.0f, 1.0f);
vector v = vector(1.0f, 5.0f, 0.2f, 1.0f);

float2x2 f2x2 = float2x2(1.0f, 2.0f, 3.0f, 4.0f);
int2x2 m = {1, 2, 3, 4};
int n = int(5);
int a = {5};
float3 x = float3(0, 0, 0);

### 1.3.4 数组

float  M[4][4];
half   p[4];
vector v[12];

### 1.3.5 结构

struct MyStruct
{
     matrix T;
     vector n;
     float  f;
     int    x;
     bool   b;
};
MyStruct s; // instantiate
s.f = 5.0f; // member access

### 1.3.6 typedef关键字

HLSLtypedef关键字功能和C++里的完全一样。例如，我们可以给类型vector<float, 3>用下面的语法命名：

typedef vector<float, 3> point;

vector<float, 3> myPoint;

……我们只需这样写：

point myPoint;

typedef const float CFLOAT;
typedef float point2[2];

### 1.3.7 变量前缀

n         static——如果全局变量带static关键字前缀，就表示它不是暴露于着色器之外的。换句话说，它是着色器局部的。如果一个局部变量以static关键字为前缀，它就有和C++static局部变量相同的行为。也就是说，该变量在函数首次执行时被一次性初始化，然后在所有函数调用中维持其值。如果变量没有被初始化，它就自动初始化为0

static int x = 5;

n         uniform——如果变量以uniform关键字为前缀，就意味着此变量在着色器外面被初始化，比如被C++应用程序初始化，然后再输入进着色器。

n         extern——如果变量以extern关键字为前缀，就意味着该变量可在着色器外被访问，比如被C++应用程序。仅全局变量可以以extern关键字为前缀。不是static的全局变量默认就是extern

n         shared——如果变量以shared关键字为前缀，就提示效果框架（参见19）：变量将在多个效果间被共享。仅全局变量可以以shared为前缀。

n         volatile——如果变量以volatile关键字为前缀，就提示效果框架（参见19）：变量将被时常修改。仅全局变量可以以volatile为前缀。

n         const——HLSL中的const关键字和C++里的意思一样。也就是说，如果变量以const为前缀，那此变量就是常量，并且不能被改变。

const float pi = 3.14f;

[声明]：本文译自Frank Luna的《Introduction to 3D Game Programming with DirectX 9.0》，限于译者水平，文中难免错漏之处，欢迎各位网友批评指正；本文仅用于学习交流与参考用途，不得用于任何形式的商业用途；如需转载需事先征得作者本人和译者的同意，保持文章的完整性，并注明作者、译者和出处，对于违反以上条款造成的后果，译者对此不负任何责任。我的邮箱地址是Raymond_King123@hotmail.com，欢迎热爱3D图形和游戏，并有一定图形编程经验的朋友来信交流。

0 0