HLSL 的基础知识

基础知识很重要,一定要抓牢!

 

一、数据类型:

HLSL中的数据类型主要有:标准类型、向量、矩阵、和复杂数据类型几大类。

   标准数据类型:

标准的数据类型有:bool ,int,half ,float,double.由于某些平台不支持整数值,所以整数可能会用float来模仿。

 

变量的声明方式和C++差不多一样,就不多说了,强调几个  有区别的点:

    1.const类型修饰符的变量,表示这个量是个常量,不可以被渲染代码修改(和C++也是很类似),这样的变量在声明的时候就需要进行初始化。

    2.row_majorcol_major修饰符

     

    这类修饰符通常出现在定义矩阵时,房子矩阵类型的前面。用于指定当前声明的矩阵是用列主序还是行主序,列主序,矩阵中的每一列都   会单独存储在一个常量寄存器中,行主序相反。

    3.static修饰符

     带这个修饰符的变量不仅具有类似于C++中的静态变量的功能,还有防止该变量暴露给应用程序的作用,在调用该HLSL文件的程序中不可以访问和更改这个变量。

    4.extern修饰符

     含义与static相反,一个变量不可以同时声明staticextern两个修饰符类型,程序可以通过SetVertexShaderConstantB函数或者ID3DXConstantTable借口的函数来设置一个extern类型变量,如果没有用修饰符,默认的就是extern修饰。

    5.uniform

      用该修饰符修饰的变量只能使用API方法来改变,并且只能在两次绘制之间被改变。

    6.shared

     共享变量,表名该变量可以在不同的效果中被共享。

 

     向量

     向量是一种特殊的数据结构,一个响亮可能包含1-4个元素,比如:bool bv//标量   bool1 bv  //一维向量  float1 fv//一维向量

float2 fv//二维向量

     初始化可以和声明同时进行,如:half2 hv={0.2,0.3};

     另一种声明方式是在一个尖括号中指明变量的类型和个数:vector<bool ,1>  bv=FALSE;

     向量的存取:一个向量最多可以包括4个元素,每个都可以通过两种命名集合来寻址,一种是位置集合,它使用xyz另一种是通过颜色集合:r g b a

     向量的混合存取:一次读取向量中的两个元素是混合存取,比如:float2 f_2D;  float4 pos;

     f_2D=pos.xy;

     向量的数学运算:乘法是最需注意的,有两种乘法,*表示矩阵之间相乘,用*乘出来的值仍然是一个矩阵,还有一个乘法函数:dot(),点乘,矩阵用点乘运算生成的是一个值,学过矩阵的话,这点应该不难明白。

     矩阵

     矩阵这个概念大家应该不陌生,用HLSL声明一个矩阵的方法:float4x4 表示44列的矩阵,注意是先行后列,double2x4表示24列的矩阵.

     另一种声明的方式和声明向量的另一种方式很像,在一个尖括号中指定该矩阵的类型和矩阵的行数和列数:matrix<float,2,2>fM={0.0f,0.1f,2.1f,2.2f};

     矩阵元素的存取:可以通过"."来取数值.具体的办法由两种,一种是 0基准 行列位置法,另一种是 1基准 行列位置法,两种基准法就和它的名字一样,起始下标的值不同罢了。_m00  _11表示的同一个元素即矩阵中的第一个元素。

     矩阵的混合存取:和向量差不多。比如_m00_m11表示取出来了两个元素

     矩阵的数组存取方式:就是用方括号括起来的下标进行存取,比如M是一个矩阵 M[0][0]=M_m00=M_11.注意:矩阵存取不可把用"."的方式和用数组的方式混合起来使用,用数组方式也不能实现混合存取矩阵.

     矩阵的数学运算:需要注意的是用*进行存储的话,并不是实现的矩阵的额相乘运算,比如 M3=M1*M2;M3中的第一个元素的值是M1._11*M2_22;    如果要做矩阵的相乘运算的话,需要用mul()函数进行计算。

     复杂的数据类型

     复杂的数据类型包含:采样器(sampler)、结构体(structure)、渲染器(shader)等等。

1.      采样器

一个采样器包含有采样状态。采样状态指定被采样的纹理,并控制纹理采样期间的纹理过滤。采样一副纹理需要一副纹理、一个采样器(带有采样状态)、一个采样指令。

采样器可以在其初始化的同时初始化其纹理和采样状态:

texture  tex0;

sampler2D  s_2D=salmpler_state

{

       Texture=<tex0>;

       MinFilter=Linear;

       MagFilter=Linear;

AddressU=Wrap;

AddressV=Wrap;

};

使用上面定义的纹理采样器 一副2D的纹理的代码如下:

float2 sample_2D(float2 tex:TEXCOORD0):COLOR

{

       return tex2D(s_2D,tex);

}

上面的例子中,使用texture类型变量tex0表示一个纹理对象,使用sampler2D类型和关键字smpler_state声明了一个采样器对象s_2D,这个采样器在大括号内指定了要采样的纹理和相关的采样状态。

注意:如果采样其中没有指定纹理的采样状态,将使用默认的采样状态:纹理过滤选择线性过滤,纹理寻址模式将采用重叠寻址模式。

上面的例子中,采样函数用一个二元的浮点纹理坐标作为输入,并返回一个二元的颜色值,这个是用函数的返回值类型决定的,float2表示返回的数据中含有两个元素的色彩值,它表示了红色和绿色的元素。

HLSL支持4中纹理 类型:sampler1D,sampler2D,sampler3D,samplerCUBE。对应的纹理采样函数是:tex1Dtex2Dtex3DtexCUBE,我们看一个3D采样的例子:

texture tex0;

sampler3D s_3D=sample_state

{

       texture=<tex0>;   

};

float3 sample_3D(float3 tex:TEXCOORD0):COLOR

{return tex3D(s_3D,tex);}

2.      结构体

C++中的结构体差别不大.

注意:在结构体里面的变量不可以带有范围的关键字修饰符 如:static等。

 

3.       顶点渲染对象

一个vertexshader类型变量代表了一个顶点渲染对象。

 

4.       像素渲染对象

一个pixelshader类型的变量就是一个像素渲染对象。

 

5.       纹理

texture类型的变量表示一个纹理对象。这个类型用于在效果中设置一个纹理到设备。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值