`

变量定义

    博客分类:
  • HLSL
 
阅读更多

 

使用下列语法规则 HLSL 变量的声明 :

Cpp代码   收藏代码
  1. [Storage_Class] [Type_Modifier] Type Name[Index]  
  2.     [: Semantic]  
  3.     [: Packoffset]  
  4.     [: Register];  
  5.     [Annotations]  
  6.     [= Initial_Value]  

 

Storage_Class :可选的修饰符,用于描述变量的作用范围和声明周期,修饰符(除部分特殊外)可以多个并列,并且不需区分顺序。

修饰符:

extern (全局)标记一个全局变量作为外部输入的着色器,这是为所有的全局变量的默认标记。不能结合static

nointerpolation (不插值)不进行插值,然后将它们传递到像素着色器顶点着色器的输出。

precise (精确)防止IEEE不安全的优化,影响这个变量。如果不加precise 关键字,变量将可能因为优化的原因产生误差,这对部分需要保持高精度的变量来说,是无法容忍的。

shared (共享:effects告诉编译器,标记过此关键字的变量是多个effects之间的共享变量。

groupshared (共享 :线程)告诉编译器,标记过此关键字的变量是多个线程之间共享的变量。

static (静态)静态变量,与C++类似,不能与extern 一起使用。

uniform (固定)被此修饰符描述的变量,在整个着色器中是不会被改变的,它默认就是全局(extern )的。

volatile (局部)就是传统的局部变量,定义的变量默认就是局部变量,所以无需添加此描述符。

 

Type_Modifier :可选变量的类型修饰符。如果你不指定这个类型修饰符值,编译器使用column_major 作为默认值。

修饰符:

const : extern 变量默认情况下,被认为是const 。定义为const 的变量必须进行初始化

row_major :标记的变量,其存储在一个单一的行的四个组件,以便它们可以被存储在一个单一的常数寄存器。

column_major :标记一个变量,它存储在一个单一的列,以优化矩阵数学的4个组件。

 

Type:应该是除HLSL默认提供的类型以外,还包括我们自定义的类型。

Buffer (线性容器):缓冲区,其中包含一个或多个标量 。可以帮它当做一个线性容器模板。

Java代码   收藏代码
  1. Buffer<float4> g_Buffer;  //float4为一个标量类型  
  2. float4 bufferData = g_Buffer.Load( 1 );  

Scalar (标量):一分量标量。

VectorMatrix (向量,矩阵):一个可变结构的容器,包含1到4个分量,这些分量应该是同类型的标量。

Cpp代码   收藏代码
  1. vector <int,    1> iVector = 1;  
  2. vector <double, 4> dVector = { 0.2, 0.3, 0.4, 0.5 };  

Sampler :取样器,这个是对采样状态的声明,用法比较复杂。

Shader :着色器。

Cpp代码   收藏代码
  1. // Direct3D 10  
  2. technique10 Render  
  3. {  
  4.     pass P0  
  5.     {  
  6.         SetVertexShader( CompileShader( vs_4_0, VS() ) ); //vs_4_0为渲染目标,VS() 渲染方法  
  7.         SetGeometryShader( NULL );  
  8.         SetPixelShader( CompileShader( ps_4_0, PS() ) );  
  9.     }  
  10. }  

Texture :纹理。纹理的定义同标量类似,只是类型不一样而已:texture (旧的类型,尽量别用), Texture1D, Texture1DArray, Texture2D, Texture2DArray, Texture3D, TextureCube.

Struct :结构,等同C++。

User Defined :用户自定义类型,例如一些C++中的基本类型,就是通过这种方式定义的。

Cpp代码   收藏代码
  1. typedef vector <int, #> int#;  // 把一个<span style="background-color: #ffffff;">vector类型,自定义为int类型,int值存储在</span><span style="background-color: #ffffff;">vector的第一个里面</span>  

 

Name[Index明明规则跟C++一样。

 

Semantic (语义)可选修饰符,在着色器的入口参数中使用,用于对输入输出变量的描述。它描述的是与CPU中定义的变量建立关联。

 

Packoffset :可选修饰符,以手动的方式,把一个常量指定到一个寄存器中。

 

Register :可选修饰符,以手动的方式,把一个变量指定到一个寄存器中。

 

Annotation(s) :可选修饰符,注解,我的理解是跟C++以及java的注解功能应该是一样。

Cpp代码   收藏代码
  1. <DataType Name = Value; ... ;>  // 格式  
  2.   
  3. int i <int blabla=27; string blacksheep="Hello There";>; // 例子  

 

Initial_Value :初始化的值,这个应该不稀奇才对。

 

总结:整个HLSL变量的定义与C++的区别并不是很大,只不过HLSL增加了自己的一些特色,例如,手动指定存储位置,语义功能。还有就是变量的作用范围的级别变了点。

 

常见寄存器:(Register )

 

b Constant buffer
t Texture and texture buffer
c Buffer offset
s Sampler
u Unordered Access View
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics