分享
 
 
 

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

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

类型修饰符

在你的着色器中打算使用的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://msdn.microsoft.com/library/en-us/dnhlsl/html/shaderx2_introductionto.asp

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有