欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>游戏开发>>文章内容
着色器和效果——1.7 内建函数
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
  http://Introduction to 3D Game Programming with DirectX 9.0

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@{域名已经过期},欢迎热爱3D图形和游戏,并有一定图形编程经验的朋友来信交流。


附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步