The Complete Effect and HLSL Guide_7(转载)

来源:互联网 发布:我的网盘java源码 编辑:程序博客网 时间:2024/06/07 00:32
转自 http://blog.csdn.net/soilwork/archive/2006/12/09/1436245.aspx
The Complete Effect and HLSL Guide(七) 
分量访问和重组
 
       如前所述,可以像访问结构成员一样来访问矢量和矩阵中的单个分量。这里对矢量和矩阵的访问方式做个小结。
 
       _11, x, r                _12, y, g                _13, z, b                _14, w, a
       _21                       _22                       _23                       _24
       _31                       _32                       _33                       _34
       _41                       _42                       _43                       _44
 
       此外,通过把二到四个分量名串连到一起作为下标来使用,还可以让矢量只包含某几个指定分量,HLSL把这门技术称为重组。这里就是一些有效的重组实例:
 
       bgr yyzw,   _12_22_32_42
 
       对矩阵来说也是如此。
 
       tempMatrix._m00_11 = worldMatrix._m00_m11;
       tempmatrix._11_22_33 = worldMatrix._24_23_22;
       temp = fMatrix._m00_m11;
       temp = fMatrix._11_22;
 
       注意,所有下标都必须来自于同一下标集,(比如xyzwrgba,或者_11_44),不同下标集之间的元素不能进行混合,比如不能出现xyrg这样的组合。同一个分量可以出现多次。但对赋值目标来说,则不允许分量重复出现。
 
注意

并不是所有硬件都支持所有类型的重组操作。对像素着色器1.x的某些版本来说,部分重组操作是不允许的。编译器可以通过模拟来补偿这些限制,但将带来一定性能损失。
 
对象类型
 
       HLSL还定义了一系列范围广泛的对象数据类型。这些类型通常用来呈现非数字数据与复合类型的句柄,典型的例子就是纹理和结构体。以下是HLSL中所定义的对象类型:
 
l         采样器
l         纹理
l         结构体
l         顶点和像素着色器
l         字符串
 
       结构的内容将在下一节关于自定义类型的部分详细讨论。
 
       字符串指使用ASCII码定义的字符串,它们除了用作注解以外,用处不是太多,这里也不对它进行详细讨论。采样器,着色器和纹理才是我们所关心的重点部分。
 
采样器和纹理
 
       HLSL定义了两种数据类型用于在shader中获取纹理信息。纹理本质上就是一个指向硬盘上一系列物理像素信息的句柄。采样器则是一组纹理采样参数的组合,比如warp mode或者mipmap属性等。
 
顶点和像素着色器
 
       HLSL定义了两种数据类型用来保存顶点和像素着色器,它们分别是vertexshaderpixelshader。如果使用asm关键字以汇编方式来编写着色程序,则可以把这些程序直接分配给着色器:
 
vertexshader vs =
{
     vs_2_0
      decl_position v0
      mov oPos, v0
};
 
       如果使用HLSL,那么则必须通过函数来定义着色器。下面就是使用高级指令定义像素着色器的例子:
 
       pixelshader ps = compile ps_2_0 psmain();
 
结构及自定义类型
 
       除了前面看到的大量预定义数据类型以外,HLSL也允许开发者创建新类型。自定义类型通常都是结构,它们是由一组其他(内置或自定义)数据类型,或基于现有类型声明的新类型,组成的对象。
 
       使用关键字struct来定义结构。结构是复合类型,用来把多个数据组合为一个整体。用下面的语法来定义结构:
 
       struct [ ID ] { members }
 
       这里是创建结构的一个例子:
 
struct Circle
{
        float4 Position;
        float Radius;
};
 
       另外,HLSL还允许使用typedef关键字,为现有类型声明一个新名称。它的语法如下:
 
       typedef [ const ] type id [ array_suffix ] [ , id…];
 
       数组后缀可以跟随在ID之后,允许把数组作为新类型。当声明了一个类型之后,就可以通过ID来对它进行引用。注意array_suffix由一个或多个literal_integer_expression组成,用来表示数组维度。
类型转换
 
       程序设计中,术语类型转换表示把一种数据转变为另一种数据的能力。HLSL支持多种内置类型间的转换。表2-4总结了内置数据间可能的转换。
 
2 -4 HLSL中的类型转换

转换类型            描述

标量——标量               这类转换总是有效的。当把布尔值转换为整型或浮点类型时,false值表示0true表示1。同样,当把整型或浮点类型转换为布尔值时,0表示false。当把浮点类型转换为整型时,将四舍五入为最接近的整数。
标量——矢量               这类转换总是有效的。转换将把标量复制并填充到矢量中。
标量——矩阵               这类转换总是有效的。转换将把标量复制并填充到矩阵中。
标量——对象               这类转换是是无效的。
标量——结构               这类转换仅当结构中的成员都为数字时才是有效的。转换将把标量复制并填充到结构中。
矢量——标量               这类转换总是有效的。转换将复制矢量中的第一个分量,并填充到标量中。
矢量——矢量               目标矢量容量不大于源矢量时才是有效的。转换只保留最左边(left-most)的分量,截去剩下的分量。
矢量——矩阵               只有当矢量和矩阵一样大时,转换才是有效的。
矢量——对象               这类转换总是无效的。
矢量——结构               这类转换只有当结构容量不大于矢量,且所有成员都为数字时才是有效的。
矩阵——标量               这类转换总是有效的。转换将把矩阵左上角的值填充到标量中。
矩阵——矢量               只有当矢量和矩阵一样大时转换才是有效的。
矩阵——矩阵               只有当目标矩阵维度不大于源矩阵时,转换才是有效的。转换将把源矩阵填充到目标矩阵的左上部分,并且丢弃余下数据。
矩阵——对象               这类转换总是无效的。
矩阵——结构               只有当结构容量和矩阵一样大,且所有成员都为数字时,转换才是有效的。
对象——标量               这类转换总是无效的。
对象——矢量               这类转换总是无效的。
对象——矩阵               这类转换总是无效的。
对象——对象               只有当两个对象都是同一类型时,转换才是有效的。
对象——结构               只有当结构包含一个以上的成员时,转换才是有效的。结构中成员的类型必须和对象的类型一样。
结构——标量               只有当结构包含一个以上的成员时,转换才是有效的。这个成员必须为数字。
结构——矢量               只有当结构容量不小于矢量时,转换才是有效的。它的第一个成员必须为数字,并且等于矢量的大小。
结构——矩阵               只有当结构容量不小于矩阵时,转换才是有效的。它的第一个成员必须是数字,并且等于矩阵大小。
结构——结构               只有当目标结构容量不大于源结构容量时,转换才是有效的。目标结构和源结构间各自成员的转换也必须是有效的。
 
~~~~~~~~~~~~~~~~~未完待续~~~~~~~~~~~~~~~~~
原创粉丝点击