1.6 用户定义函数
阅读此文表明您已同意文末的声明
HLSL中的函数有下例属性:
n 函数使用类似C++的语法
n 参数总是按值传递
n 递归不被支持
n 函数总是inline的
此外,函数还加上了一些用于其上的额外的关键字。例如,考虑一个写在HLSL中的下面这个函数:
bool foo(in const bool b, // input bool
out int r1, // output int
inout float r2) // input/output float
{
if( b ) // test input value
{
r1 = 5; // output a value through r1
}
else
{
r1 = 1; // output a value through r1
}
// since r2 is inout we can use it as an input
// value and also output a value through it
r2 = r2 * r2 * r2;
return true;
}
函数几乎和C++函数是一样的,除了in,out和inout关键字:
n in——指定型参(argument,特指传递给实参的变量)应该在函数开始前被拷贝给实参。传入参数不必强制指定,因为实参默认是in的。例如,下面两段是等价的:
float square(in float x)
{
return x * x;
}
也可以不强制指定in:
float square(float x)
{
return x * x;
}
n out——指定实参应该在函数返回时被拷贝给型参。这样可以通过参数返回值。out关键字是必须的,因为HLSL不允许传递一个引用或一个指针。我们要注意:如果实参标记为out,在函数开始前,型参就不拷贝给实参。换句话说,out实参仅可以被用于输出数据——它不能用于输入。
void square(in float x, out float y)
{
y = x * x;
}
这里,我们输入了要被乘方的数x,并且通过参数y返回了x的乘方。
n inout——这是一个指示实参既用于输入又用于输出的快捷方法。如果要使用实参同时用作输入和输出,就指定inout。
void square(inout float x)
{
x = x * x;
}
这里,我们输入了要被乘方的数x,同时又通过x返回了的x的乘方。
[声明]:本文译自Frank Luna的《Introduction to 3D Game Programming with DirectX 9.0》,限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;本文仅用于学习交流与参考用途,不得用于任何形式的商业用途;如需转载需事先征得作者本人和译者的同意,保持文章的完整性,并注明作者、译者和出处,对于违反以上条款造成的后果,译者对此不负任何责任。我的邮箱地址是Raymond_King123@hotmail.com,欢迎热爱3D图形和游戏,并有一定图形编程经验的朋友来信交流。