在学习Directx11编程中,你会发现图形渲染等等很大一部分需要一种叫做HLSL(High Level Shading Language),中文应该叫:高级着色器语言,由微软拥有及开发的一种语言,HLSL 独立的工作在 Windows 平台上,只能供Direct3D使用。 HLSL是微软抗衡GLSL的产品,同时不能与OpenGL标准兼容,废话不多说了,我们来看看到底啥子是HLSL,希望我们可以慢慢熟悉他。
一·变量
在HLSL中变量有点像C语言中的一样,也分为局部变量和全局变量,变量也由类型修饰,变量的声明格式如下:
1
[Storage_Class] [Type_Modifier] Type Name[Index]
2
3 [: Semantic]
4
5 [Annotations]
6
7 [ = Initial_Value]
8
9 [: Packoffset]
10
11 [: Register];
2
3 [: Semantic]
4
5 [Annotations]
6
7 [ = Initial_Value]
8
9 [: Packoffset]
10
11 [: Register];
参数说明:
- Storage_Class:相当于C等等的域【注:暂时还只是学习,很多都需要在实践中才能真正明白其中的道理,那样才能说得更清楚,所以如果有错误希望访问者能够指出来,这样我也能够进步,也有助于我的学习】。
extern(全局变量默认声明,不能和static合用);
nointerpolation(当顶点着色器进入到像素着色器时,不使用内插补点)[注:可能翻译有点错误,以后再说!];
precise(严格限定,感觉不好翻译,直接英文注释吧:Affects all results that contribute to the variable's outcome by preventing the compiler from doing unsafe optimizations. For instance, to improve performance the compiler ingores the possibility of NaN and INF results for floating point variables from constant and stream inputs in order to do several optimizations. By using the precise keyword, these optimizations will be prohibited for all calculations affecting the result of the variable.);
shared(共享Mark a variable for sharing between effects; this is a hint to the compiler.);
groupshared(Mark a variable for thread-group-shared memory for compute shaders. In D3D10 the maximum total size of all variables with the groupshared storage class is 16kb, in D3D11 the maximum size is 32kb.);
static(主要限定局部变量,即初始化只有一次,第一次使用时初始化,如果没有初始化默认为0,这个和C++局部静态变量有点一样);
uniform(Mark a variable whose data is constant throughout the execution of a shader (such as a material color in a vertex shader); global variables are considered uniform by default.);
volatile(仅限局部变量,这个应该和C++里的一样,经常变动改变的变量); - Type_Modifier:类型修饰符,一般有const(表示常量),row_major(行,将4个部分连续的保存在同一行中),column_major(列,将4个部分连续保存在同一列中)。后面两个相当于一个4x4矩阵中的行和列,在Direct3D编程中4x4矩阵是经常使用的,在Directx11的学习中我们会提到。
- Type类型,就是数据类型,在后面将进行讨论。
- Name[Index]变量名称,大家都懂,后面“[]”表示数组。
- Semantic 语义声明,主要描述变量使用信息,一般作为编译器链接着色器输入和输出使用。只有在全局变量和函数输入输出参数和返回值时才有用,其它地方使用编译器将过滤。顶点着色器和像素着色器都预定义了一些声明,在以后使用时将进行介绍。
- Annotation(s) 注释,以“<DataType Name = Value; ... ;>”格式进行注释,一般在全局变量中使用,HLSL编译器将过滤注释字符串。
1 int i < int blabla = 27 ; string blacksheep = " Hello There " ; > ;
2
3 int j < int bambam = 30 ; string blacksheep = " Goodbye There " ; > = 5 ;
4
5 float y < float y = 2.3 ; > = 2.3 , z < float y = 1.3 ; > = 1.3 ;
6
7 half w < half GlobalW = 3.62 ; > ;
8
9 float4 main(float4 pos : SV_POSITION ) : SV_POSITION
10 {
11 pos.y = pos.x > 0 ? pos.w * 1.3 : pos.z * . 032 ;
12 for ( int x = i; x < j ; x ++ )
13 {
14 pos.w = pos.w * pos.y + x + j - y * w;
15 }
16
17 return pos;
18 } - Initial_Value 初始化值;
- Packoffset
- Register
下面来看一下例子,这样就可以让我们更好的理解上面的一些内容。
1
float
fVar;
2 float4 color;
3 float fVar = 3.1f ;
4
5 int iVar[ 3 ];
6
7 int iVar[ 3 ] = { 1 , 2 , 3 };
8
9 uniform float4 position : SV_POSITION;
10 const float4 lightDirection = { 0 , 0 , 1 };
2 float4 color;
3 float fVar = 3.1f ;
4
5 int iVar[ 3 ];
6
7 int iVar[ 3 ] = { 1 , 2 , 3 };
8
9 uniform float4 position : SV_POSITION;
10 const float4 lightDirection = { 0 , 0 , 1 };
看过去是不是很像C/C++的样子,其中float4表示是4个,相当于一个数组,在HLSL中默认的基础数据类型都包含了4及以下的下标。当然矩阵在HLSL中是很常见的,如float4x4等,其中数字就是所说的意思。而SV_POSITION就是描述语义,即顶点坐标的意思。今天就学习到这里,有空了继续学习........
本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2011/07/14/directx_hlsl_basic.html,如需转载请自行联系原作者