文档章节

DirectX 9高层着色语言介绍2——语言基础(1)

rise-worlds
 rise-worlds
发布于 2016/06/20 13:35
字数 1289
阅读 3
收藏 0
original address: http://blog.csdn.net/starflash2003/archive/2004/10/09/130020.aspx

语言基础

现在你已经对什么是HLSL顶点和像素着色器以及他们如何与低层汇编着色器相互作用有了了解,我们将讨论一些语言本身的细节。

关键字

关键字是HLSL语言保留的预定义标识符,不能在你的程序中作为标识符使用。标有'*'的关键字不区分大小写。

表2. HLSL语言所保留的关键字

asm* bool compile const
decl* do double else
extern false float for
half if in inline
inout int matrix* out
pass* pixelshader* return sampler
shared static string* struct
technique* texture* true typedef
uniform vector* vertexshader* void
volatile while    

下列关键字当前没有使用,不过保留给将来使用:

表3. 当前并没使用的保留关键字

auto break compile const
char class case catch
default delete const_cast continue
explicit friend dynamic_cast enum
mutable namespace goto long
private protected new operator
reinterpret_cast short public register
static_cast switch signed sizeof
throw try template this
typename unsigned using union
virtual      

数据类型

HLSL支持各种数据类型,从简单的标量到较复杂的类型如向量和矩阵。

标量类型

语言支持以下标量数据类型:

表4. 标量数据类型

bool true or false
int 32-bit signed integer
half 16-bit floating point value
float 32-bit floating point value
double 64-bit floating point value

如果你已经熟悉了汇编层编程模型,就会知道并非所有图形处理器天生就支持这些数据类型。因此,整数也许需要由浮点硬件来仿真实现。这意味着并不保证超出整数 (在这些平台上用浮点数表示的)范围的整数运算如期望那样运行。另外,并非所有对象平台支持半精度或双精度值。如果不支持,将使用单精度浮点数来仿真。

向量类型

常常会在HLSL着色器中声明向量变量。声明这些向量有许多方法,包括下列所示:

表5. 向量类型

vector 一个四维向量; 每一维是浮点类型
vector < type,  size > 维数为size的向量; 每一维是type类型

声明向量最通常的方法是在类型后跟一个2-4的整数作为名字。例如,要声明一个4元组单精度浮点型,可以如下声明:


  
float4 fVector0;
float   fVector1[ 4 ];
vector fVector2;
vector 
< float 4 >  fVector3;

例如,要声明一个3元组布尔型,可以如下声明:

bool3 bVector0;bool  bVector1[3];vector <bool, 3> bVector2;

一旦定义了一个向量,就可通过使用类似访问数组的语法或使用一个swizzle来访问其单独的维数。在这个swizzle例子中,维数必须来自于{x. y, z, w}或{r, g, b, a}命名空间 (不过不是两者都)。例如:

 

float4 pos  =  { 3.0f 5.0f 2.0f 1.0f };
float   value0  =  pos[ 0 ];  //  value0 is 3.0f
float   value1  =  pos.x;   //  value1 is 3.0f
float   value2  =  pos.g;   //  value2 is 5.0f
float2 vec0    =  pos.xy;  //  vec0 is {3.0f, 5.0f}
float2 vec1    =  pos.ry;  //  INVALID because of bad swizzle


需要注意的是ps_2_0和更低的像素着色器模型并不支持arbitrary swizzles(译者注:Arbitrary swizzle实际上可以看作一个“修正器”(modifier),它用于修改指令和寄存器。其主要功能是减少在一个着色器中使用的指令数目,从而提高效率。)因此,当编译成这些对象时,原本简洁的高层代码(使用swizzle)可能变成相当难理解的二进制汇编代码。你应当熟知这些汇编模型中可以用到的 swizzle。

矩阵类型

HLSL着色器中还常常会用到的变量类型是矩阵,它是二维数组。与标量和向量一样,矩阵由其他一些基本数据类型组成:布尔型,整型,半精度,单精度或双精度浮点型。矩阵可以是任意大小,不过一般都使用4行4列的矩阵。你可以再调用本章开头顶点着色器的例子,在全局范围声明两个4 × 4单精度浮点型矩阵:


  
float4x4 view_proj_matrix;
float4x4 texture_matrix0;

自然,也可使用其他维数的矩阵。例如,我们用不同方式声明一个3行4列的单精度浮点型矩阵:


  
float3x4            mat0;
matrix
< float 3 4 >  mat1;

和向量一样,可以使用存取数组或结构体/swizzle的语法访问矩阵中的单一元素。例如,要访问矩阵view_proj_matrix的左上角元素可以使用如下面例子中数组下标的方法:

float fValue = view_proj_matrix[0][0];

也有用结构体的语法,定义结构体是由于要访问和swizzling of矩阵元素。从0开始的行列位置,如下:

_m00, _m01, _m02, _m03_m10, _m11, _m12, _m13_m20, _m21, _m22, _m23_m30, _m31, _m32, _m33

从1开始的行列位置,如下:

_11, _12, _13, _14_21, _22, _23, _24_31, _32, _33, _34_41, _42, _43, _44

也可以使用数组符号访问矩阵:例如:

float2x2 fMat  =  { 3.0f 5.0f ,   //  row 1
                  2.0f 1.0f };  //  row 2
float   value0  =  fMat[ 0 ];       //  value0 is 3.0f
float   value1  =  fMat._m00;     //  value1 is 3.0f
float   value2  =  fMat._12       //  value2 is 5.0f
float   value3  =  fMat[ 1 ][ 1 ]     //  value3 is 1.0f
float2 vec0    =  fMat._21_22;   //  vec0 is {2.0f, 1.0f}
float2 vec1    =  fMat[ 1 ];       //  vec1 is {2.0f, 1.0f}

本文转载自:http://www.cnblogs.com/flying_bat/archive/2007/11/29/977090.html

共有 人打赏支持
rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
GPU通用计算API的变迁和趋势

摘要: 在高性能计算、机器学习等现代应用领域中,GPU(Graphics Processing Unit)是占统治地位的计算引擎。GPU从早期的固化逻辑实现、到可编程、到今天的通用计算架构(GPGPU),其应用接口...

wd1095864717
2017/07/07
0
0
u3d shader着色器学习笔记(一)

基础知识:MeshFilter 存储一个mesh(网格,模型网格,模型由哪些三角面组成,组成什么样子的模型,三角面的一些顶点信息) MeshRender 根据MeshFilter 存储的三角面顶点信息 用来渲染一个模...

nihao561
2018/05/24
0
0
OpenGLES2.0基础及着色器语言(2)

着色器语言GLSL?片元着色器和顶点着色器。 数学矩阵在openGL中应用,在图形学中应用,openGL中的矩阵变换? > OpenGLES2.0基础 Android OpenGLES2.0(一)——了解OpenGLES2.0- http://blo...

shareus
2017/12/04
0
0
directx 11 64位

directx 11 64位是一款微软出品的一个多媒体编程接口,这款程序专门用于微软各个平台的电子游戏开发。DirectX 11带来了Tessellation(拆嵌式细分曲面技术)、Multi-Threading(多线程)、Dir...

相心的泪
2016/07/20
7
0
【Visual C++】游戏开发笔记二十四 由DirectX的几个版本说开去

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7629288 作者:毛星云 邮箱: happylifemxy@qq.com 期待着与志同道合的朋友们相互交...

长平狐
2012/11/12
76
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue.js开发环境搭建说明(mac)

vue开发环境搭建(mac) 投影放大:cmd + + 安装Node 下载Node 官网下载 https://nodejs.org/en/download/ 安装Node 双击安装包,选择安装目录,比如: /usr/local/bin 安装成功后最好记录一...

Danni3
25分钟前
2
0
Qt编写自定义控件3-速度仪表盘

前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业...

飞扬青云
31分钟前
1
0
【论文阅读】Image Super-Resolution via Deep Recursive Residual Network

题目:通过深度递归残差网络实现图像的超分辨率 摘要: 近年来,基于卷积神经网络的模型在单张图像的超分辨率上已经取得了巨大的成功。由于深度网络的强大,这些CNN模型学习了从低分辨率输入...

云烟成雨forever
33分钟前
2
0
为什么强烈建议大家使用枚举来实现单例

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

群星纪元
52分钟前
14
0
Confluence 6 超过当前许可证期限进行升级

这个页面将会对你在进行 Confluence 升级的时候超过了当前许可证的期限进行升级的情况。 许可证警告 在升级的过程中,你将会在 Confluence 的应用程序日志(log file)中看到类似下面的错误提...

honeymoose
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部