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

来源:互联网 发布:c与c加加 java 编辑:程序博客网 时间:2024/06/05 05:24

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++函数是一样的,除了inoutinout关键字:

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

 

原创粉丝点击