The Complete Effect and HLSL Guide(五)
本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。
由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。
翻译:clayman
Blog:http://blog.csdn.net/soilwork
clayman_joe@yahoo.com.cn
词汇约定
虽然语法定义了如何把所有语言元素组合到一起,比如,如何定义函数和代码片段,但它只定义了如何把表达式和操作符以及标识符一起使用。这意味着语言的语法并没有定义文法(例如: 什么是标识符)。接下来的几段详细解释了HLSL编译器中的词汇约定。
空白字符
HLSL语言中,下面这些字符都被认为是空白字符:
l 空格
l Tab字符
l 换行符
l C风格的注解(/* */)。
l C++风格的注解( // )。
l asm代码块中,汇编风格的注解(;)。
数字
HLSL中的数字可以为浮点类型,也可以为整型。浮点数通常有以下呈现形式:
Float: ( fractional-constant [ exponent-part ] [ float-suffix ] )|
(digit-sequence exponent-part [ float-suffix ] )
Fractnal-const: ( [digit – sequence] . digit – sequence ) | (digit – squence . )
Sign: + | -
Dight – sequence: digit | (digit – sequence digit )
floating – suffix: h | H | f | F
整型的语法与此类似:
Integer: integer – constant [ interger – suffix ]
Integer – constant: digit – sequence | ( 0 digit – sequence ) | ( 0 × digit – sequence )
Digit – sequence: digit | ( digit – sequence digit )
Integer – suffix: u | U | l | L
字符
HLSL允许定义字符和字符串。字符串都是由字符组成。下面是字符的定义:
l ‘ c ‘ (字符)
l ‘ /t ‘ , ‘ /n ‘,…..( 转义字符 )
l ‘ /### ‘ (八进制换码顺序 )
l ‘ /x## ‘ (十六进制换码顺序)
注意
预处理指令中不能包含转义字符。
字符串包含在一对引号中,可以包含前面所述的任意有效字符组合。
标识符
标识符用来表示函数名或变量名之类的语言元素。除了前面所列的关键字以外,标识符可以是字母和数字的任意组合,但必须保证第一个字符为字母。
操作符
HLSL定义了一组操作符,以便在表达式中使用。表1-5 列出了所有标准操作符,以及他们的含义。如果你熟悉C或C++,那么这些操作符对你来说应该是一目了然的。
表 1-5 HLSL 操作符
操作符 描述 |
++ 一元加法。
-- 一元减法。
&& 逻辑与。
|| 逻辑或。
== 等号。
:: 成员标识符(用于结构和类)。
<< 二进制左移。
<<= 自赋值(self assigning)二进制左移,a<<= b等于a = a<<b。
>> 二进制右移。
>>= 自赋值二进制右移,a>>=b等于a = a>>b。
… 省略符(用于可变参数函数)。
<= 小于等于。
>= 大于等于。
!= 不等于。
*= 自赋值乘法, a *= b 等于 a = a * b。
/= 自赋值除法, a /= b 等于 a = a / b。
+= 自赋值加法, a += b 等于 a = a + b。
-= 自赋值减法, a -= b 等于 a = a – b。
%= 自赋值求余, a %= b 等于 a = a % b。
&= 自赋值逻辑与, a &= b 等于a = a & b。
|= 自赋值逻辑或, a |= b 等于 a = a | b。
^= 自赋值求幂, a ^= b 等于 a = a ^ b。
-> 重定向操作符,用来访问结构成员。
语言语法
HLSL语言的语法相当简单。初看可能有些复杂,但只要使用它写几个程序,你马上就能掌握要领。目前为止,你不应该对语法太过担心,后面的章节我们将逐步了解语言的每个部分。由于实际的语法表相当长,我决定单独把他放到附录D中。另外你也可以参考DirectX SDK获取更多信息。
(译注:请参考DirectX SDK中DirectX Graphics--Reference--HLSL Shader Reference--Appendix中的Language Syntax部分)
观察表的第一行,可以看到HLSL程序被定义为一个program。每个program要么为空,要么包含一系列decl(声明)。最初的两行表示每个decls可以由多条其它decl组成。你可能已经注意到,声明可以用来定义空白语句,类型声明,变量声明,结构声明,函数声明或technique声明。语义定义了不同声明类型等等。
小结以及接下来的内容
在这一章里,我们简要概括了DirectX和shader技术在过去几年间的发展和历史。随着shader model 2.0和3.0复杂度的增加,开发者不但需要利用语言的所有新能力,同时,还需要高效的完成任务。由于新着色管道的指令和通用处理器上的指令越来越类似,因此,开发一门高级语言,让开发者把注意力集中在shader所要实现的功能上,而不是把精力放在如何使用寄存器,或对某种硬件如何组合指令才能最优化之类的琐碎问题上是很有意义的。
在需求的驱动下,微软开发并通过DirectX SDK发布了HLSL着色语言,帮助开发者使用最新的图形技术,创建更加真实的图形。本章,我们学习了很多语法背后的基础知识。虽然这章看起来有些枯燥,不要担心,随后的几个章节我们就会讨论一些比较有趣的内容。
下一章,我们将学习HLSL语言中关于变量,表达式和数据类型的内容。继续上路吧……
~~~~~~~~~~~~~~~~~~~~~~~~第一章完~~~~~~~~~~~~~~~~~~~~~~~~~~