本文说明了纹理映射。
纹理映射也很简单,纹理是一张图像,纹理的左下角坐标为(0,0),右上角坐标为(1,1)。在传入三角形三个顶点的时候传入坐标,渲染器会在片段着色器之前对其进行插值,从而得到对应的纹理坐标。
这里主要要实现的是gl shader
中的texture
函数。这个函数接收一个纹理和一个纹理坐标,并返回这个坐标上的颜色信息:
1
2
3
4
5
6
7
| inline Color4 TextureSample(const Surface* const surface, Vec2 texcoord) {
texcoord.x = Clamp<real>(texcoord.x, 0, 1);
texcoord.y = Clamp<real>(texcoord.y, 0, 1);
// nearest sample
return surface->GetPixel(texcoord.x * surface->Width(), texcoord.y * surface->Height());
}
|
这里首先对纹理坐标Clamp
以确保其在[0,1]中,然后对纹理进行采样,将数据返回。
这里做的是临近采样,纹理还有双线性插值法,即当你的纹理坐标为小数的时候(比如(2.2,2.3))这个时候如果直接转换为整数采样就是临近采样,而双线性插值则是要在x方向和y方向分别取最临近的点(这里是(2,2),(3,2)和(2,2),(2,3),然后对x方向和y方向进行线性插值(比如x方向就是color2,2+(color3,2−color2,2)∗0.2)以得到更加平滑的效果。