像素Shader首先包含了三个采样器,分别对应3个不同的纹理。这里有个术语让很多初学者很迷惑——“采样器”,什么是“采样器”?,
采样器在程序中做了什么?
采样器:采样器这个关键词如果你在搜索引擎中搜索,大多得到的是音频上的处理,但是纹理采样器与其原理类似,我们利用更优秀
的采样算法将被赋予纹理的3D模型映射在2D屏幕上更加清晰,失真更小,下面是纹理采样器中最基本的3种采样技术:
1.最近点采样技术
2.线性采样技术
3.各向异性与MIPMAP采样技术
三种采样效果如下图所示
1.最近点采样
2.线性采样
3.各项异性与MIPMAP采样
(以上三幅图像均来自:http://www.cnitblog.com/luckydmz/archive/2011/04/04/73261.html)
这就是纹理采样器 —— 用作对纹理映射到2D屏幕的具体优化技术,避免过度失真。
理解了采样器,再回头来看着色Shader中的代码就容易明白许多了,首先知道了着色Shader中,sampler就是采样器,
用作对纹理进行处理的单元。那么来看下聚光灯的着色Shader代码:
// File name : Spotlight.psh
// Date : 2011.12.20
// Description :
//
//
// 3 textures needs these samplers.
sampler box;
sampler spot;
sampler str;
// Output
struct PS_OUTPUT
{
vector color : COLOR0;
};
// Input
struct PS_INPUT
{
float2 box : TEXCOORD0;
float2 spot : TEXCOORD1;
float3 str : TEXCOORD2;
};
// Main —— Pixel Shader exe function
PS_OUTPUT Main(PS_INPUT input)
{
PS_OUTPUT output = (PS_OUTPUT)0;
// tex2D(param1, param2);
// param1 : sampler state, from app.
// param2 : texture 2d coordinate.
vector b = tex2D(box, input.box);
vector s = tex2D(spot, input.spot);
vector t = tex2D(str, input.str);
// According following formula to mix.
vector c = b * s + t;
c = c + 0.1f;
output.color = c;
return output;
}