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查询

posted @   Destiny233  阅读(237)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示