DirectX 9高层着色语言介绍3——语言基础(2)
类型修饰符
在你的着色器中打算使用的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声明。不过由于值在着色器中可以被修改,所以不可能是常数。
例如,假定你在全局范围声明了下列变量:
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语言中的习惯一样可以在变量声明时进行初始化。例如:
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类型,相当于:
vTone.y = vBrightness.y * vExposure.y;
vTone.z = vBrightness.z * vExposure.z;
vTone.w = vBrightness.w * vExposure.w;
要注意在4D向量vBrightness和vExposure间不是点乘。此外,用这种方式乘以矩阵变量不会引起矩阵相乘。点乘法和矩阵相乘法是通过内部函数mul()实现的,这将在后边讨论。
构造函数
常能在HLSL着色器中见到的属于其他语言特色的是构造函数,和C++中的类似不过增加了一些处理复杂数据类型的内容。构造函数使用的例子:
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)相关推荐
- python语言介绍-Python语言的简介
___________________________________________________________我是一条分割线__________________________________ ...
- python语言介绍-00-python语言介绍
以下为摘录的python的介绍 Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译.其他解释型语言还包括PHP和Ruby. Python是动态类型 ...
- python语言介绍-Python语言简介
一.Python语言发展史 1989年吉多·范罗苏姆(Guido van Rossum)中文外号"龟叔",圣诞节期间开始编写Python语言的编译器. Python这个名字,来自G ...
- Arduino语言介绍
Arduino语言介绍 Arduino语言是建立在C/C++基础上的,其基础是C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让不了解AV ...
- Lua:01---Lua语言介绍、运行Lua程序(lua解释器)
一.Lua语言介绍 Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处: 一方面, Lua语言不需要在性能.与三方软件交互等C语言已经非 ...
- EL(Expression Language)语言介绍
目录 一.EL语言介绍 二.EL语言基本语法 三.EL语言的操作符 Empty操作符(空值检查) 比较操作符编辑 EL表达式运算符 四.EL内置对象 五.EL语言作用 一.EL语言介绍 EL语言是J ...
- Go语言学习笔记之基础语法(一)
目录 1. Go语言介绍 Go语言是什么 Go语言优势 Go适合用来做什么 2. Go环境搭建 通过Sublime 编译运行go程序 学习资料 3. 第一个Go程序 通过命令行运行程序 4. 基础语法 ...
- openGL中GLSL语言介绍
GLSL 语言概念介绍 内容翻译至GLSLangSpec.1.20,已尽量通顺,随便看看吧 介绍 概述 用这种语言编写的独立编译单元称为着色器.一个程序是一组完整的着色器,它们被编译和链接在一起.本文 ...
- Scheme 语言介绍
Scheme 语言介绍 Wolfgang Kreutzer 翻译:寒蝉退士 原文:http://www.cosc.canterbury.ac.nz/~wolfgang/cosc302/Chap2.3. ...
最新文章
- ajax与easyui树节点,EasyUI中的tree用法介绍
- git 客户端查看不同分支的文件
- C语言程序运行慢是什么问题,为什么cgo的表现如此缓慢?我的测试代码有什么问题吗?...
- AAAI 2022 | 基于词对关系建模的统一NER,刷爆14个中英NER数据集
- iOS开源照片浏览器框架SGPhotoBrowser的设计与实现
- web测试常用的用例及知识
- php获取对象属性值
- 云服务器上搭建hadoop伪分布式环境
- 这可能是有史以来最详细的JNI入门教程
- 使用bus hound发送包的方法
- 令牌桶限流-java实现
- Vue实例与组件实例
- 智能优化及其相关算法
- 2018 BACS Regional Programming Contest F. Football Free Kick(map离散化)
- 爽!一个注解,搞定 SpringBoot 操作日志
- UltraEdit 15 注册码
- 抑制细胞代谢紊乱的抑制剂
- 领导拒绝涨薪?我直接跳槽,涨薪6k
- 百度搜索引擎技巧 百度搜索技巧 百度查询技巧
- java-opencv 米粒数_opencv学习之米粒分割 #201906121549
热门文章
- hdu1255 扫描线,矩形重叠面积(两次以上)
- hdu4756 最小树+树形dp
- 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 EventChannel 通信 )
- 【错误记录】jar 执行错误 ( java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0 )
- 【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 )
- 【计算机网络】数据链路层 : 差错控制 ( 检错编码 | 奇偶校验码 | CRC 循环冗余码 )★
- 【Android 系统开发】Android JNI 之 JNIEnv 解析
- mysql 日期字符串互转
- 动态生成RadialMenuContainer
- postman测试传入json