1.7 内建函数
阅读此文表明您已同意文末的声明
HLSL有一个丰富的内建函数的集合,它们对3D图形来说非常有用。下表是一个删减了的列表。在下两章中,我们会使用这些函数中的一些进行实践。而现在,熟悉它们就够了。
注意:要得到更多的参考,可以参看DirectX文档中内建HLSL函数的完整列表,在Content页下,然后到DirectX Graphics\Reference\Shader Reference\High Level Shader Language\Intrinsic Functions。
译者注:以下表格中,//<variable>//表示变量variable的模(例如向量的绝对值)。
函数
描述
abs(x)
返回 |x|.
ceil(x)
返回 ≥ x 的最小整数.
clamp(x, a, b)
截取x到 [a, b] 范围内并返回截取后的结果.
cos(x)
返回x的余弦,其中x单位为弧度.
cross(u, v)
返回 u × v(叉积).
degrees(x)
转换 x 从弧度到角度.
determinant(M)
返回矩阵M的行列式det(M).
distance(u, v)
返回u点和v点之间的距离||v - u||.
dot(u, v)
返回 u · v(点积).
floor(x)
返回 ≤ x 的最大整数.
length(v)
返回 ||v||.
lerp(u, v, t)
在u和v之间线性插值,根据参数 t ∊ [0, 1 ].
log(x)
返回 ln(x).
log10(x)
返回 log10(x).
log2(x)
返回 log2(x).
max(x, y)
如果x ≥ y,则返回 x;否则返回 y.
min(x, y)
如果 x ≤ y,返回x;否则返回 y.
mul(M, N)
返回矩阵乘积 MN. 注意:矩阵乘积必须是已定义的. 如果M是一个向量,它被作为一个行向量,则向量-矩阵(vector-matrix)乘法是已定义的。类似的,如果N 是一个向量,他被作为一个列向量,则矩阵-向量(matrix-vector)乘法是已定义的.
normalize(v)
返回 v/∥v∥.
pow(b, n)
返回 bn.
radians(x)
转换 x 从 角度 到 弧度.
reflect(v, n)
给定向量v和表面法线n,计算其反射向量.
refract(v,n, eta)
给定向量v、表面法线n和两种材质的两个索引的比率eta,计算其折射向量. 翻看一下物理书中Snell的规则或者在互联网上搜索一下关于refraction(反射)的信息.
rsqrt(x)
返回x的平方根的倒数.
saturate(x)
返回clamp(x, 0.0, 1.0).
sin(x)
返回x的正弦,其中x单位为弧度.
sincos(in x, out s, out c)
返回x的正弦和余弦,其中x单位为弧度.
sqrt(x)
返回x的平方根.
tan(x)
返回x的正切,其中 x 单位为弧度.
transpose(M)
返回MT的转置.
大多数函数已经重载以使其可以对所有内建类型有意义。例如,abs对所有数值类型有意义,所以它为所有这些数值类型进行了重载。又例如,叉积的叉乘仅对3D向量有意义,所以它对所有类型的3D向量(比如:int,float,double的3D向量)进行了重载。另一方面,线性插值——lerp,对于数值、2D、3D和4D向量有意义,因此重载了这些类型。
注意:如果你传递进去一个非数值类型到一个(要求)数值类型的函数,也就是一个仅能对数值类型进行操作的函数(比如:cos(x)),那么这个函数会对传进去的每个分量进行操作。例如,你写:
floats v = float3 (0.0f, 0.0f, 0.0f);
v = cos(v);
那么函数将会对每个分量进行操作:v=(cos(x),cos(y),cos(z))。
下例展示了这些固有的函数可能被调用的方式:
float x = sin(1.0f); // sine of 1.0f radian.
float y = sqrt(4.0f); // square root of 4.
vector u = {1.0f, 2.0f, -3.0f, 0.0f};
vector v = {3.0f, -1.0f, 0.0f, 2.0f};
float s = dot(u, v); // compute dot product of u and v.
float3 i = {1.0f, 0.0f, 0.0f};
float3 j = {0.0f, 1.0f, 0.0f};
float3 k = cross(i, j); // compute cross product of i and j.
matrix<float, 2, 2> M = {1.0f, 2.0f, 3.0f, 4.0f};
matrix<float, 2, 2> T = transpose(M); // compute transpose
[声明]:本文译自Frank Luna的《Introduction to 3D Game Programming with DirectX 9.0》,限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;本文仅用于学习交流与参考用途,不得用于任何形式的商业用途;如需转载需事先征得作者本人和译者的同意,保持文章的完整性,并注明作者、译者和出处,对于违反以上条款造成的后果,译者对此不负任何责任。我的邮箱地址是Raymond_King123@hotmail.com,欢迎热爱3D图形和游戏,并有一定图形编程经验的朋友来信交流。