文档章节

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

rise-worlds
 rise-worlds
发布于 2016/06/20 13:34
字数 1073
阅读 4
收藏 0
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类型。

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

rise-worlds

rise-worlds

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

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

wd1095864717
2017/07/07
1
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
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
13
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
19分钟前
17
3
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部