从0开始制作软渲染器(四)

本文说明了纹理映射。

纹理映射

纹理映射也很简单,纹理是一张图像,纹理的左下角坐标为(0,0)(0, 0),右上角坐标为(1,1)(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][0, 1]中,然后对纹理进行采样,将数据返回。

这里做的是临近采样,纹理还有双线性插值法,即当你的纹理坐标为小数的时候(比如(2.2,2.3)(2.2, 2.3))这个时候如果直接转换为整数采样就是临近采样,而双线性插值则是要在x方向和y方向分别取最临近的点(这里是(2,2),(3,2)(2, 2), (3, 2)(2,2),(2,3)(2, 2), (2, 3),然后对x方向和y方向进行线性插值(比如x方向就是color2,2+(color3,2color2,2)0.2color_{2,2}+(color_{3,2}-color_{2,2})*0.2)以得到更加平滑的效果。

updatedupdated2025-06-162025-06-16