着色器和效果——1.6 用户定义函数

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航