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

本文说明了纹理映射。

纹理映射

纹理映射也很简单,纹理是一张图像,纹理的左下角坐标为$(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方向就是$color_{2,2}+(color_{3,2}-color_{2,2})*0.2$)以得到更加平滑的效果。

updatedupdated2023-06-082023-06-08