HLSL中的函数

来源:互联网 发布:eduline源码 编辑:程序博客网 时间:2024/05/20 20:17

 

函数的作用是为了降低程序的复杂度。HLSL的函数与C函数类似:他们都有定义与函数体,而且他们都可以有返回值与声明列表。与C函数一样,HLSL通过参数列表与返回值类型进行匹配。

C函数不同的是,HLSL入口函数使用语义来将函数声明绑定到SHADER的输入输出上。这使得把缓冲区数据绑定到SHADER上变的容易。

函数包含一个声明与一个函数体,声明必须在函数体前。

下面分析一下这个函数:

float4 Light(float3 LightDir : TEXCOORD1, 
             uniform float4 LightColor,  
             float2 texcrd : TEXCOORD0, 
             uniform sampler samp) : COLOR 
{
    float3 Normal = tex2D(samp,texcrd);
 
    return dot((Normal*2 - 1), LightDir)*LightColor;
}
这个函数返回一个最终颜色,这是一个由纹理采样结果和灯光颜色组成的函数。这个函数有四个输入,两个是有语义的,LightDirTEXCOORD1语义,而texcrdTEXCOORD0语义。语义意味着这些变量保存的数据来自顶点缓冲区。尽管LightDir有着TEXCOORD1语义,这个参数可能并不是一个纹理坐标。TEXCOORDn语义类型经常用来为你提供一种传递需要顶点保存但顶点没有预先定义的参数的方法。
另外两个输入,LightColorsampuniform关键字。Uniform常量是不会在渲染时被改变的。这些参数通常来自SHADER的全局变量。
参数可以带inoutinout关键字,且只能用值传递的方法,但是如果使用inout关键字,在函数输入时它就是原数据的拷贝,并在返回又重新拷贝回原数据中,相当于一个引用传递。