一个纹理采样器包含采样状态,采样状态指定了纹理将如何被采样,并控制采样过程中的纹理过滤.在纹理采样时需要做三件事情:(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).