代码仓库
1.为什么使用纹理
在之前的章节中,我们绘制了一个矩形,给了它特定的颜色,也通过矩阵操作了它平移旋转。但无论是炫酷的3A大作,还是简单的益智游戏,都是很漂亮,很有设计感的。单纯通过给顶点颜色,几乎很难做到,那么我们可以通过给这个矩形贴上一张图片,让他变得华丽起来。比如我的一个场景(可看这里的视频):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfyjvkX3-1623148877864)(https://oscimg.oschina.net/oscnet/up-f4dcd721a39d5639cc2aa941ee60b5fad5c.png)]
上图中,背景的图片,圆形的图片,小雨滴,甚至81192这几个字也是图片,也就是纹理。它几乎无处不在,极大的丰富我们的画面。
2.纹理采样与纹理环绕
纹理坐标在几何上是连续的,而片段或者像素是离散的,当我们要将坐标映射到纹理上,从纹理上去除颜色值给OpenGL,就是采样的过程。
- 3.1 采样/纹理过滤
OpenGL中的过滤方式由多种,常用的两种:GL_NEAREST和GL_LINEAR。
GL_NEAREST(最近邻):
从图上可以看出,要采样这个坐标的颜色,在GL_NEAREST模式下,会找一个离他最近的一个中心点的颜色,来作为最后的结果。
GL_LINEAR(线性插值):
线性插值的情况下,会找周围相邻的几个点的颜色,做一个平均。当然也不是绝对的平均,会根据距离做加权平均。也不一定是选取周围4个,这些值不固定,与算法实现有关系,但道理是相通的。
两种过滤方式,会产生明显的差别,可以参看如下图示:
在OpenGL中可以很简单的设置:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- 3.2 纹理环绕
OpenGL规定纹理坐标的范围是[0,1],如果超过了怎么办呢?
实际中我们见过很多这种情况,铺地板。假如每块地板都是一个纹理,不停的铺同一种地板就是一种纹理环绕方式:重复。参看如下图示:
OpenGL提供多种环绕方式:
GL_REPEAT 重复纹理图像。 这是OpenGL的默认选项。
GL_MIRRORED_REPEAT 也是重复,但是图片被镜像了。
GL_CLAMP_TO_EDGE 超出的部分全都用边缘的颜色代替。
GL_CLAMP_TO_BORDER 超出的部分用户自己指定颜色。
看下图:
在OpenGL中我们可以这样设置:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
如果自己设置颜色,则可以通过这样设置:
float borderColor[] = {