HLSL开发一:语言基础

简介:

在学习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];
复制代码

参数说明:

  1. 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++里的一样,经常变动改变的变量);
  2. Type_Modifier:类型修饰符,一般有const(表示常量),row_major(行,将4个部分连续的保存在同一行中),column_major(列,将4个部分连续保存在同一列中)。后面两个相当于一个4x4矩阵中的行和列,在Direct3D编程中4x4矩阵是经常使用的,在Directx11的学习中我们会提到。
  3. Type类型,就是数据类型,在后面将进行讨论。
  4. Name[Index]变量名称,大家都懂,后面“[]”表示数组。
  5. Semantic 语义声明,主要描述变量使用信息,一般作为编译器链接着色器输入和输出使用。只有在全局变量和函数输入输出参数和返回值时才有用,其它地方使用编译器将过滤。顶点着色器和像素着色器都预定义了一些声明,在以后使用时将进行介绍。
  6. 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  }
    复制代码
  7. Initial_Value 初始化值;
  8. Packoffset
  9. 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 };
复制代码

看过去是不是很像C/C++的样子,其中float4表示是4个,相当于一个数组,在HLSL中默认的基础数据类型都包含了4及以下的下标。当然矩阵在HLSL中是很常见的,如float4x4等,其中数字就是所说的意思。而SV_POSITION就是描述语义,即顶点坐标的意思。今天就学习到这里,有空了继续学习........

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2011/07/14/directx_hlsl_basic.html,如需转载请自行联系原作者

相关文章
|
17天前
|
人工智能 前端开发 JavaScript
Harmony 开发的艺术 面向对象
Harmony 开发的艺术 面向对象
32 0
|
5月前
|
编译器 C语言 C++
|
Rust
Rust 语言基础 | 学习语言都应该快速得出印象
Rust 语言基础 | 学习语言都应该快速得出印象
163 0
Rust 语言基础 | 学习语言都应该快速得出印象
|
Shell BI 测试技术
Haskell 编程入门
在过去的几个月里,学习Haskell让我觉得非常快乐,但是入门的过程并没有我原先想象的那么简单。我非常幸运地在一个正确的地方工作,并且因此能够在Facebook参加Bryan O'Sullivan的Haskell课程。在Try Haskell上玩了一段时间后,最终你就会想要在自己的电脑上安装GHC了。
200 0
Haskell 编程入门
|
存储 Java 程序员
C++ 开发者快速学习 Objective-C 语言核心语法
本文将讨论 Objective-C 语言的核心语法。这部分开始详述一些具体的语法。正如你期待的一样,涉及到了定义和类。
253 0
|
编译器 API C#
C#与C++混合编程
C#与C++混合编程
220 0
|
Rust IDE JavaScript
Rust语言教程(2) - 从熟悉的部分开始
虽然有默认不变性还有所有权的问题让Rust一上来用起来有些不同,但是其实大部分语法特点还是我们所熟悉的。 我们没必要上来就跟自己死磕,可以先从我们熟悉的部分开始学习。 一般我们写代码,使用的主要是数据类型、控制结构和函数。我们就从这三部分开始。
419 0
Rust语言教程(2) - 从熟悉的部分开始
|
Dart 编译器 数据格式