OpenGL学习(3)——纹理
在渲染三角形的时候,我们都是通过指定顶点的颜色来渲染三角形颜色的。但是对于某些有复杂颜色的三角形,这样会非常麻烦。
我们希望给一个图片,给一些坐标,让程序自己去找到对应的图像颜色。这个图片就是纹理。我们只需要告知三角形三个顶点所对应在纹理图片上的坐标,程序会自行将这些坐标内的像素映射到三角形上。这就是纹理的作用。
纹理环绕方式
纹理坐标的范围通常是从(0, 0)到(1, 1),当纹理坐标超出了0~1怎么办,OpenGL提出了这些方法
- GL_REPEAT 对纹理的默认行为。重复纹理图像。
- GL_MIRRORED_REPEAT和GL_REPEAT一样,但每次重复图片是镜像放置的。
- GL_CLAMP_TO_EDGE,纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。
- GL_CLAMP_TO_BORDER,超出的坐标为用户指定的边缘颜色。
纹理过滤
纹理过滤指的是如何将纹理坐标对应到纹理颜色。纹理是一张图片,它放大以后也是一个一个像素。如何基于纹理坐标来找到其对应的颜色,OpenGL提供了两种方法。
- GL_NEAREST,近邻过滤,距离坐标最近的那个像素格子就是
- GL_LINEAR,线性过滤,对附近的像素做加权(插值)
Mipmap
考虑这种情况,在屏幕上,很远地方的一个物体,它实际对应到的三角形是很小的。也就是说,屏幕仅能使用很少的像素点来表示这个物体。但是实际上这个物体又占用了很大一块纹理。那现在的目标就转化成了,将很大一块纹理,映射到很少的几个像素点上。
比如400*400映射到1个像素上。这时候如果单用纹理上的1个像素点去对应屏幕上的1个像素肯定是不行的。这损失了大量的信息。必须做插值。
刚说了,最坏情况是,用一个像素表示整个纹理。好一点的情况是,用一些像素,表示整个纹理。那每个像素都应该保存某些纹理像素的颜色插值。这个插值就是通过Mipmap来查询的。
简单来说,我们可以在每次采样的时候就直接去计算,屏幕上的某个点,需要哪些纹理像素,然后做插值。但很显然这没必要。我们完全可以预处理这些插值的值,然后通过Mipmap查询
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通