分享
 
 
 

高级着色器语言(High-Level Shader Language)

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

高级着色器语言(High-Level Shader Language) ——DirectX9

译者:高超震 ——孤独一剑

你是不是厌倦了用汇编语言写着色器?可以试一下高级着色器语言(High-Level Shader Language——HLSH)。Microsoft DirectX9包含了可用于开发和调试着色器的类C语言HLSH。这种特性DirectX 8.0开始,是对汇编着色器的扩展,可用于顶点着色器(vertex shaders),像素着色器(pixel shaders),以及特效。

HLSH支持类C函数开发着色器,支持函数(fuctions),表达式(expresstions),声明(statements),标准数据类型(standard date types),自定义数据类型(user-desighed date types),预处理指令(preprocessor directives)。

******数据类型(date types)******

数值类型(scalar types)

bool true or false

int 32位整数

half 16位浮点数

float 32位浮点数

doule 64位浮点数

不是所有的目标平台都支持整数型数据,整数型可能被浮点型硬件模拟。在这些平台上整数型操作超出整数位的部分会表达成浮点型,这种情况DirectX不保证执行期望的功能。

不是所有的目标平台都支持half和doule类型,如果不支持将用float类型模拟。

矢量类型(vector types)

vector 由四个float类型组成的矢量

vector<type,size> 由size个数值类型组成的矢量

矢量的各个组成部分可以通过标量存取,通过数组存取语法,如下:

vec[0] (same as vec.x)

vec[3] (same as vec.w)

也可以通过名称存取,通过结构成员存取语法,以下矢量的名称设置如下:

Default set

x y z w

Color set

r g b a

通过名字存取的矢量(原文Vectors containing swizzled components of the vector)可以写成两个或以上组成部分名字连接在一起的形式。比如:yyzw或者bgr。连接起来的名字必须来自同一个名字设定。相同的部分被重复是无效的。

矩阵类型(matrix types)

matrix 4*4矩阵,由float类型组成

matrix<type,rows,columns> row*col矩阵,由type类型组成

矩阵的各部分可以通过标量存取,通过数组存取语法如下:

mat[2] (same as mat.m20m21m22m23)

mat[2].w (same as mat.m23) ///原文如此

mat[2][3] (same as mat.m23)

也可以通过名称存取,通过结构成员存取语法,以下矩阵的名称设置如下:

基于1的设置

_11 _12 _13 _14

_21 _22 _23 _24

_31 _32 _33 _34

_41 _42 _43 _44

基于0的设置

_m00 _m01 _m02 _m03

_m10 _m11 _m12 _m13

_m20 _m21 _m22 _m23

_m30 _m31 _m32 _m33

通过名字存取的矩阵(原文Vectors containing swizzled components of the matrix)可以写成两个或以上组成部分名字连接在一起的形式。比如:_41_42_43 or _m01_m02_m03_m04。连接起来的名字必须来自同一个名字设定。相同的部分被重复是无效的。

******对象类型******

字符串(string)

ASCII字符串类型,没有操作和状态接受字符串。字符串参数和注释可以通过ID3DXEffect界面被应用程序质问(query)。

像素着色器(pixelshader)

一个pixelshader对象表示Direct3D像素着色器对象。当着色器函数里没有操作直接接受像素着色器时,像素着色器可以在technique内部设置给设备。下例可以被一个pixelshader对象质问,通过结构成员存取语法。

const string version;

字面上的pixelshader值可以被表示成汇编块:

pixelshader ps = asm { ps.2.0 mov oC0, c0 };

或者一个compile调用:

pixelshader ps = compile ps_2_0 psmain();

取样器(sampler)

一个sampler对象表示Direct3D取样器层。其样器层被用来取样纹理。取样器被指定纹理和过滤类型。

纹理(texture)

一个texture对象表示Direct3D纹理对象。当着色器函数没有操作直接接受纹理时,纹理可以在technique中被设置给设备。下例可以被一个texture对象质问,通过结构成员存取语法。

const string type;

const string format;

const int width;

const int height;

const int depth;

顶点着色器(vertexshader)

一个vertexshader对象表示Direct3D顶点着色器对象。当着色器函数没有操作直接接受顶点着色器时,顶点着色器可以在technique中被设置给设备。下例可以被一个vertexshader对象质问,通过结构成员存取语法。

const string version;

字面上的pixelshader值可以被表示成汇编块:

vertexshader vs = asm { vs.2.0 mov oPos, c0 };

或者一个compile调用:

vertexshader vs = compile vs_2_0 psmain();

对象的结构存取方法还没有被完全贯彻。

******结构类型(struct types)

struct关键字被用来定义结构类型。一旦结构被定义,就可以通过其标识符(ID)被引用。

struct [id] { member_list }

一个member_list由一个或多个成员声明(member declarations)组成。成员声明类似于变量声明(声明在下面),除非他们不能被初始化或者被单独地声明为static, extern, volatile, or const。

******用户自定义类型******

typedef关键字被用来为一种类型定义一个名字。const关键字被用来标明其为常量类型。Array_suffix可以放在每一个ID后面。一旦自定义类型被定义,就可以通过其标识符(ID)被引用。

typedef [const] type id [array_suffix] [, id ...] ;

一个array_suffix由一个或多个int表达式,表示其维度(dimension)。

为了与Direct3D extensions(D3DX)8.0保持兼容,下列类型被自动定义了:

typedef int DWORD;

typedef float FLOAT;

typedef vector VECTOR;

typedef matrix MATRIX;

typedef string STRING;

typedef texture TEXTURE;

typedef pixelshader PIXELSHADER;

typedef vertexshader VERTEXSHADER;

为了方便,下列类型被自动定义了(#表示1-4之间的数字)

typedef vector bool#;

typedef vector int#;

typedef vector half#;

typedef vector float#;

typedef vector double#;

typedef matrix bool#x#;

typedef matrix int#x#;

typedef matrix half#x#;

typedef matrix float#x#;

typedef matrix double#x#;

******类型转换******

Scalar-to-scalar

总是有效的,当从bool型转化为整数型或浮点型时, false被认为是0,true为1。当整数型或浮点型转化为bool型时,0为true,非0为false。当从浮点型转化为整数型时,值被除余(the value is rounded toward zero)

Scalar-to-vector

总是有效的,复制数值型填充vector

Scalar-to-matrix

总是有效的,复制数值型填充matrix

Scalar-to-object

无效的

Scalar-to-structure

如果结构的所有部分均为数值则有效,复制数值填充结构

Vector-to-scalar

总是有效的,选择向量的第一部分

Vector-to-vector

目标矢量必须大于资源矢量保持左值,去掉多余值。这样做的目的是行矩阵,列矩阵和数字结构可以看成是矢量

Vector-to-matrix

大小必须相等

Vector-to-object

无效的

Vector-to-structure

结构不大于矢量,且结构各部分均为数字则有效

Matrix-to-scalar

总是有效的,选择了矩阵的左上部分

Matrix-to-vector

大小必须相等

Matrix-to-matrix

目标矩阵在任何一维都不大于资源矩阵 ,这个操作保持左上值,去掉多余值。

Matrix-to-object

无效的

Matrix-to-structure

结构的大小等于矩阵的大小,结构的所有组成部分都是数字

Object-to-scalar

无效的

Object-to-vector

无效的

Object-to-matrix

无效的

Object-to-object

对象类型完全相同则有效

Object-to-structure

结构必须包含比成员更多的内容,此成员的类型必须与结构类型完全相同

Structure-to-scalar

结构必须包含至少一个数字型成员

Structure-to-vector

结构至少是矢量的大小,第一个组成部分必须是数字,直到矩阵的大小

Structure-to-matrix

结构必须至少是矩阵的大小。第一个组成部分必须是数字,直到矩阵的大小

Structure-to-object

结构至少包含一个对象的成员。这个成员的类型必须和对象类型完全相同。

Structure-to-structure

目标结构必须大于资源结构

累了,看反响如何决定是否继续。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有