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) | |
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图形和游戏,并有一定图形编程经验的朋友来信交流。