original address: http://blog.csdn.net/starflash2003/archive/2004/10/12/132884.aspx

类型修饰符

在你的着色器中打算使用的HLSL中有几个可选的类型修饰符。通常把不想被着色器的代码修改的量设为const(常量)类型修饰符。在赋值符号左边使用常量(例如作为一个lval)会产生一个编译错误。

可以用row_major(行优先)类型修饰符与col_major(列优先)类型修饰符指定在存储常数硬件中的矩阵格式。row_major(行优先)类型修饰符表示矩阵中的每一行被存储在一个单个的常数寄存器中。同样地,使用col_major(列优先)表示矩阵中的每一列被存储在一个单个的常数寄存器中。默认为列优先。

存储类别修饰符

存储类别修饰符通知编译器给定变量的作用域和生存期。这些修饰符是可选的,可在变量类型前以任意次序出现。

像C 语言一样,一个变量可以被声明为static(静态变量)或extern(外部变量)。(这两个修饰符是互斥的)在全局范围,static(静态)类别修饰符表示变量只能由着色器访问,而不能由应用程序通过API访问。任何在全局范围声明的非静态变量可以由应用程序通过API修改。像C语言一样,在局部范围使用static(静态)修饰符表示变量所含数据将在所声明函数内始终存在(译者注:即生存期为全局,作用域为函数内)。

在全局范围使用extern(外部)修饰符表示可由外部着色器通过API修改。不过这属于多此一举,因为在全局范围声明的变量默认就是这样。

使用shared(共享)修饰符设定将由两种效果共享的全局变量。

前缀为uniform的变量先在外部被初始化,然后进入HLSL着色器。(例如,通过Set*ShaderConstant*() API)。把全局变量当作被uniform声明。不过由于值在着色器中可以被修改,所以不可能是常数。

例如,假定你在全局范围声明了下列变量:

extern float translucencyCoeff;
const  float gloss_bias;
static float gloss_scale;
float diffuse;

变量diffuse和translucencyCoeff可被Set*ShadercConstant*() API置位,也可被着色器本身修改。常量gloss_bias可被Set*ShadeConstant*() API置位,不过不能被着色器代码修改。最后,静态变量gloss_scale不能被Set*ShaderConstant*()API置位,不过可以也只能在着色器中被修改。

初始化

如前面例子显示的,和C语言中的习惯一样可以在变量声明时进行初始化。例如:

float2x2 fMat = {3.0f, 5.0f,  // row 1
                 2.0f, 1.0f}; // row 2
float4   vPos = {3.0f, 5.0f, 2.0f, 1.0f};
float fFactor = 0.2f;

向量运算

在HLSL中,当执行关于向量的数学运算时需要留心一些程序陷阱(gotchas)。如果为3D图形编写着色器,绝大部分程序陷阱(gotchas)可以靠直觉发现。例如,定义标准的二元运算符以进行每一维的运算。

float4 vTone = vBrightness * vExposure;

假定vBrightness和vExposure都是float4类型,相当于:

float4 vTone;vTone.x = vBrightness.x * vExposure.x;
vTone.y = vBrightness.y * vExposure.y;
vTone.z = vBrightness.z * vExposure.z;
vTone.w = vBrightness.w * vExposure.w;

要注意在4D向量vBrightness和vExposure间不是点乘。此外,用这种方式乘以矩阵变量不会引起矩阵相乘。点乘法和矩阵相乘法是通过内部函数mul()实现的,这将在后边讨论。

构造函数

常能在HLSL着色器中见到的属于其他语言特色的是构造函数,和C++中的类似不过增加了一些处理复杂数据类型的内容。构造函数使用的例子:

float3   vPos     = float3(4.0f, 1.0f, 2.0f);
float    fDiffuse = dot(vNormal, float3(1.0f, 0.0f, 0.0f));
float4   vPack    = float4(vPos, fDiffuse);

构造函数通常用在:想要临时定义一个常量(如上边的dot(vNormal, float3(1.0f, 0.0f, 0.0f)))或想同时显式地压缩更小的数据类型。(如上边的float4(vPos, fDiffuse))。在这个例子中,构造函数float4接收一个float3类型和一个float类型同时返回一个数据被压缩的float4类型。

DirectX 9高层着色语言介绍3——语言基础(2)相关推荐

  1. python语言介绍-Python语言的简介

    ___________________________________________________________我是一条分割线__________________________________ ...

  2. python语言介绍-00-python语言介绍

    以下为摘录的python的介绍 Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译.其他解释型语言还包括PHP和Ruby. Python是动态类型 ...

  3. python语言介绍-Python语言简介

    一.Python语言发展史 1989年吉多·范罗苏姆(Guido van Rossum)中文外号"龟叔",圣诞节期间开始编写Python语言的编译器. Python这个名字,来自G ...

  4. Arduino语言介绍

    Arduino语言介绍 Arduino语言是建立在C/C++基础上的,其基础是C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让不了解AV ...

  5. Lua:01---Lua语言介绍、运行Lua程序(lua解释器)

    一.Lua语言介绍 Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处: 一方面, Lua语言不需要在性能.与三方软件交互等C语言已经非 ...

  6. EL(Expression Language)语言介绍

    目录 一.EL语言介绍 二.EL语言基本语法 三.EL语言的操作符 Empty操作符(空值检查) 比较操作符​编辑 EL表达式运算符 四.EL内置对象 五.EL语言作用 一.EL语言介绍 EL语言是J ...

  7. Go语言学习笔记之基础语法(一)

    目录 1. Go语言介绍 Go语言是什么 Go语言优势 Go适合用来做什么 2. Go环境搭建 通过Sublime 编译运行go程序 学习资料 3. 第一个Go程序 通过命令行运行程序 4. 基础语法 ...

  8. openGL中GLSL语言介绍

    GLSL 语言概念介绍 内容翻译至GLSLangSpec.1.20,已尽量通顺,随便看看吧 介绍 概述 用这种语言编写的独立编译单元称为着色器.一个程序是一组完整的着色器,它们被编译和链接在一起.本文 ...

  9. Scheme 语言介绍

    Scheme 语言介绍 Wolfgang Kreutzer 翻译:寒蝉退士 原文:http://www.cosc.canterbury.ac.nz/~wolfgang/cosc302/Chap2.3. ...

最新文章

  1. ajax与easyui树节点,EasyUI中的tree用法介绍
  2. git 客户端查看不同分支的文件
  3. C语言程序运行慢是什么问题,为什么cgo的表现如此缓慢?我的测试代码有什么问题吗?...
  4. AAAI 2022 | 基于词对关系建模的统一NER,刷爆14个中英NER数据集
  5. iOS开源照片浏览器框架SGPhotoBrowser的设计与实现
  6. web测试常用的用例及知识
  7. php获取对象属性值
  8. 云服务器上搭建hadoop伪分布式环境
  9. 这可能是有史以来最详细的JNI入门教程
  10. 使用bus hound发送包的方法
  11. 令牌桶限流-java实现
  12. Vue实例与组件实例
  13. 智能优化及其相关算法
  14. 2018 BACS Regional Programming Contest F. Football Free Kick(map离散化)
  15. 爽!一个注解,搞定 SpringBoot 操作日志
  16. UltraEdit 15 注册码
  17. 抑制细胞代谢紊乱的抑制剂
  18. 领导拒绝涨薪?我直接跳槽,涨薪6k
  19. 百度搜索引擎技巧 百度搜索技巧 百度查询技巧
  20. java-opencv 米粒数_opencv学习之米粒分割 #201906121549

热门文章

  1. hdu1255 扫描线,矩形重叠面积(两次以上)
  2. hdu4756 最小树+树形dp
  3. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 EventChannel 通信 )
  4. 【错误记录】jar 执行错误 ( java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0 )
  5. 【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 )
  6. 【计算机网络】数据链路层 : 差错控制 ( 检错编码 | 奇偶校验码 | CRC 循环冗余码 )★
  7. 【Android 系统开发】Android JNI 之 JNIEnv 解析
  8. mysql 日期字符串互转
  9. 动态生成RadialMenuContainer
  10. postman测试传入json