使用下列语法规则 HLSL 变量的声明 :
- [Storage_Class] [Type_Modifier] Type Name[Index]
- [: Semantic]
- [: Packoffset]
- [: Register];
- [Annotations]
- [= 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 (线性容器):缓冲区,其中包含一个或多个标量 。可以帮它当做一个线性容器模板。
- Buffer<float4> g_Buffer; //float4为一个标量类型
- float4 bufferData = g_Buffer.Load( 1 );
Scalar (标量):一分量标量。
Vector, Matrix (向量,矩阵):一个可变结构的容器,包含1到4个分量,这些分量应该是同类型的标量。
- vector <int, 1> iVector = 1;
- vector <double, 4> dVector = { 0.2, 0.3, 0.4, 0.5 };
Sampler :取样器,这个是对采样状态的声明,用法比较复杂。
Shader :着色器。
- // Direct3D 10
- technique10 Render
- {
- pass P0
- {
- SetVertexShader( CompileShader( vs_4_0, VS() ) ); //vs_4_0为渲染目标,VS() 渲染方法
- SetGeometryShader( NULL );
- SetPixelShader( CompileShader( ps_4_0, PS() ) );
- }
- }
Texture :纹理。纹理的定义同标量类似,只是类型不一样而已:texture (旧的类型,尽量别用), Texture1D, Texture1DArray, Texture2D, Texture2DArray, Texture3D, TextureCube.
Struct :结构,等同C++。
User Defined :用户自定义类型,例如一些C++中的基本类型,就是通过这种方式定义的。
- 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的注解功能应该是一样。
- <DataType Name = Value; ... ;> // 格式
- 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 |
相关推荐
1.2编程基础之变量定义、赋值及转换(10题)--题目 有链接.pdf
从键盘任意输入一个整数,编程判断它的奇偶性。要求输入变量定义为int类型且由用户从键盘输入。
STM32外扩RAM做变量定义与内部RAM做堆栈的设置[借鉴].pdf
1.2 编程基础之变量定义、赋值及转换 python版.zip
变量定义分辨文档.doc^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
结构说明和结构变量定义 结构说明和结构变量定义 结构说明和结构变量定义
内存分配与变量定义方法
STM32的变量定义,对学好stm32很有帮助啊!
51单片机C语言变量定义.pdf
寄件的
02_SHELL编程之变量定义
makefile中变量定义符号.doc makefile 变量 = := ?= +=
oracle变量定义详解.docx
oracle变量定义详解.pdf
CT各变量定义及解释.pdf
Qt连接mysql数据库,全局变量定义db
2.随机变量定义与分布.ppa
1.2编程基础之变量定义、赋值及转换 noi.openjudge.cn 共包含10个文件,其他文件陆续更新中......
vb.net五子棋(自定义控件应用与全局变量定义)
Kotlin+变量定义+函数定义+数组+实例 这篇文章主要是写给需要快速上手Kotlin 的 Java 程序员看的, 这时候他们关注的是如 何 Kotlin 写出类似某些 Java 的写法,所以本文基本不涉及 Kotlin 的高级特性。