纹理采样

    一个纹理采样器包含采样状态,采样状态指定了纹理将如何被采样,并控制采样过程中的纹理过滤.在纹理采样时需要做三件事情:(1)获取纹理(2)声明一个采样器(3)定义采样器.

    这里写一个简单实例:   

texture Tex2D;
sampler2D Sampler2D = sampler_state{

 

    Texture = < Tex2D >;
    MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;

 

};

    从中,我们可以看出,这个实例中首先声明了一个纹理和一个采样器,并通过让采样器包含一个采样状态来定义采样器的基本控制,这里指明采样器是采样Tex2D纹理,并使用线形过滤方式,具体的状态定义可以参看SDK中有关纹理过滤与寻址的内容(_D3DSMPLESTATETYPE).

    如果你使用确省方式定义如下:

    sampler2D Sampler2D;

    那么采样器状态默认为线形过滤(LINEAR)和重叠纹理寻址(WRAP).

 

    如果你希望读取一个纹理特定位置的象素,可以使用,tex1D,tex2D,texCUBE等,以下以tex2D为例:

    float4 sample_2D(float2 tex : TEXCOORD0) : COLOR
   {
      return tex2D(s_2D, tex);
   }

    tex2D接受一个采样器和2D纹理地址作为参数,定位出纹理上的特定象素,具体可以参看SDK中纹理映射的相关部分.

 

    如果在纹理查找函数后附加"bias"或"proj"后缀(如tex2Dbias).如果附加"proj"那么纹理坐标将被w分量除;如果附加"bias",那么mip级别(渐进过滤级别)将被w分量调整,注意,此时,tex1D与tex2D的无关分量被忽略(如tex2D的z分量).

 

    采样器也可以使用数组,一般用在循环体中,代码如下: 

sampler sm[4];
float4 main(float4 tex[4] : TEXCOORD) : COLOR
{
    float4 retColor = 1;

    for(int i = 0; i < 4;i++)
    {
        retColor *= tex2D(sm[i],tex[i]);
    }

    return retColor;
}

    有时候可能会遇到两个纹理定义在同一个fx中会出现问题,这大概是因为在API程序中用固定渲染管线和可编程渲染管线同时涉及设置纹理的原因(我也不敢说一定是这样,因为我以前碰到过这样的问题,我的解决方案就是坚决不用固定函数渲染管线来干预Shader).

   

   

   

 

你可能感兴趣的:(编程,api,float,shader)