着色器和效果——1.7 内建函数

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)

uv之间线性插值,根据参数 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向量(比如:intfloatdouble3D向量)进行了重载。另一方面,线性插值——lerp,对于数值、2D3D4D向量有意义,因此重载了这些类型。

注意:如果你传递进去一个非数值类型到一个(要求)数值类型的函数,也就是一个仅能对数值类型进行操作的函数(比如: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图形和游戏,并有一定图形编程经验的朋友来信交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值