HLSL中提供的true和false关键字与C++相同。
int:32位有符号整数 half:16位浮点数 float:32位浮点数 double:64位浮点数
float2 float3 float4 分别为 2D 3D 4D向量。
复合分量:(以下为复制操作)不一定要复制每个分量,可以只复制x、y分量。
float4 u = {1.0f, 2.0f, 3.0f, 4.0f}; float4 v = {0.0f, 0.0f, 5.0f, 6.0f}; v = u.wyyx; // v = {4.0f, 2.0f, 2.0f, 1.0f}
矩阵类型:
floatmxn matmxn;
如:float3x4:3 × 4 矩阵,每个元素都是float类型。还可以创建其他类型的矩阵,比如int2x2、half3x3和bool4x4。
在表示4D向量和矩阵时,除了使用float4 和float4x4外,还可以使用vector和matrix:
我们可以使用双下标数组语法来访问矩阵元素,也可以像访问结构体成员那样访问矩阵中的元素。元素名可以采用以下两种表示方式:
从 1开始编号:
M._11 = M._12 = M._13 = M._14 = 0.0f;
M._21 = M._22 = M._23 = M._24 = 0.0f;
从 0开始编号:
M._m00 = M._m01 = M._m02 = M._m03 = 0.0f;
M._m10 = M._m11 = M._m12 = M._m13 = 0.0f;
有时需要引用矩阵中的某个行向量,我们可以通过单下标数组语法来完成:
float3 ithRow = M[i]; // get the ith row vector in M
结构体的定义方法与C++完全相同,只是HLSL 中的结构体不能包含成员函数。HLSL 提供了非常灵活的类型转换机制。HLSL 中的类型转换语法与C 语言相同。
HLSL中的关键字:
asm bool compile const decl do double else extern false float for half if in inline inout int matrix out pass pixelshader return sampler shared static string struct technique texture true typedef uniform vector vertexshader void volatile while
双目运算的变量提升:
对于双目运算,当左操作数和右操作数的维度不同时,维度较小的操作数将提升(转换)到与维度较大的操作数相同的维度。
对于双目运算,当左操作数和右操作数的类型不同时,精度较低的操作数将提升(转换)到与精度较高的操作数相同的类型。
HLSL中的函数具有如下特性:
1.函数使用一种与C++类似的语法。
2.参数均为按值传递。
3.不支持递归。
4.所有的函数都是内联函数。
HLSL提供了大量用于3D绘图的函数,下面列出了其中的一部分:(许多函数都为“所有使函数有意义的”内置类型提供了相应的重载版本。)
1.abs(x) — 返回 的绝对值。
2.ceil(x) — 返回大于等于 x 的最小整数。
3.clamp(x, a, b) — 将 x 截取到[ a,b ] 区间,并返回截取后的值。(即,当 x< a时,返回 a;当 x> b时,返回 b;当 x∈ [ a, b] 时,返回x 。)
4.clip(x) — 该函数只能在像素着色器中调用;当 x< 0 时,丢弃当前像素,不再进行后续处理。
5.cos(x) — 返回 的余弦值,其中x 的单位为弧度。
6.cross(u, v) — 返回 u和 v的叉积。
7.degrees(x) — 将 x从弧度转换为角度。
8.determinant(M) — 返回矩阵M 的行列式。
9.distance(u, v) — 返回点 u和v 之间的距离。
10.dot(u, v) — 返回u 和v 的点积。
11.floor(x) — 返回小于等于x 的最大整数。
12.frac(x) — 返回浮点数的小数部分(即,尾数)。例如,当 x= (235.52, 696.32) 时,frac( x) = (0.52, 0.32)。
13.length(v) — 返回向量 v的长度。
14.lerp(u, v, t) — 根据参数 t 计算u 和 v之间的线性插值,其中 t∈ [0, 1]。
15.log(x) — 返回 ln(x )。
16.log10(x) — 返回 log ( x)。
17.log2(x) — 返回 log ( x)。
18.max(x, y) — 当x ≥ y时,返回 x;反之,返回y 。
19.min(x, y) — 当 x≤y 时,返回 x;反之,返回y 。
20.mul(M, N) — 返回矩阵乘积MN 。注意,矩阵乘积MN必须满足矩阵乘法的定义。如果M 是一个向量,则M 将被视为一个行向量,以满足向量-矩阵乘法定义。如果N是一个向量,则 N将被视为一个列向量,以满足矩阵-向量乘法定义。
21.normalize(v) — 返回规范化的v 向量,即 v /‖ v ‖。
22.pow(b, n) — 返回 b^n。
23.radians(x) — 将x 从角度转换为弧度。
24.saturate(x) — 返回clamp( x, 0.0, 1.0)。
25.sin(x) — 返回x 的正弦值,其中x 的单位为弧度。
26.sincos(in x, out s, out c) — 返回x 的正弦值和余弦值,其中x 的单位为弧度。
27.sqrt(x) — 返回√ x。
28.reflect(v, n) — 根据入射向量 v 和表面法线 n 来计算反射向量。
29.refract(v, n, eta) — 根据入射向量v 、表面法线n 和两种材质之间的折射指数比eta 来计算反射向量。读者可以在网上或物理书中查找有关Snell折射定律的信息。
30.rsqrt(x) — 返回1/√ x。
31.tan(x) — 返回x 的正切值,其中 x的单位为弧度。
32.transpose(M) — 返回 M的转置矩阵。
33.Texture2D::Sample(S, texC) — 根据 SamplerState 对象S 和2D 纹理坐标texC,对一个2D纹理贴图进行采样。(SamplerState对象指定了纹理过滤方式和纹理寻址模式。)
34.Texture2D::SampleLevel(S, texC, LOD) — 根据 SamplerState对象S和2D纹理坐标texC,对一个2D 纹理贴图进行采样。(SamplerState 对象指定了纹理过滤方式和纹理寻址模式。)该函数与Texture2D::Sample的区别在于第3个参数,它指定了所要采样的多级渐近纹理层。例如,当LOD 指定为0 时,该函数会对最上面的多级渐近纹理层进行采样。使用该函数可以手工指定所要采样的多级渐近纹理层。
35.TextureCube::Sample(S, v) —根据SamplerState 对象S 和3D 查找向量v ,对一个立方体贴图进行采样。(SamplerState对象指定了纹理过滤方式和纹理寻址模式。)