VTK 学习----3D基础知识-纹理

2.6 纹理

2.6.1 纹理原理

我们了解到,为了向对象添加更多细节,我们可以使用每个顶点的颜色来创建一些有趣的图像。然而,要获得更多的细节,我们必须有许多顶点,以便我们可以指定很多颜色。这会占用相当多的额外开销,因为每个模型需要更多顶点,并且每个顶点也需要颜色属性。

艺术家和程序员通常喜欢使用的是纹理。纹理是用于向对象添加细节的2D图像(甚至存在1D和3D纹理); 把纹理想象成一张纸,上面有漂亮的砖图像(例如),它整齐地贴在你的3D房子上,所以看起来你的房子有一个石头外观。因为我们可以在单个图像中插入大量细节,所以我们可以给出对象非常详细无需指定额外顶点的错觉。

除了图像,纹理还可以用于存储大量数据以发送到着色器。

为了将纹理映射到三角形,我们需要告诉三角形的每个顶点它对应于哪个部分纹理。因此每个顶点都应该有一个纹理坐标与它们相关联,指定要从中采样的纹理图像的哪个部分。然后片段插值对其他片段进行其余的处理。

纹理坐标范围从0到1的x和y轴线(记住,我们使用2D纹理图像)。调用使用纹理坐标检索纹理颜色采样。纹理坐标从(0,0)纹理图像的(1,1)左下角开始到纹理图像的右上角。下图显示了我们如何将纹理坐标映射到三角形:

https://learnopengl.com/img/getting-started/tex_coords.png

我们为三角形指定3个纹理坐标点。我们希望三角形的左下侧与纹理的左下侧对应,因此我们使用(0,0)三角形左下角顶点的纹理坐标。这同样适用于具有(1,0)纹理坐标的右下侧。三角形的顶部应与纹理图像的顶部中心对应,因此我们将(0.5,1.0)其作为纹理坐标。我们只需要将3个纹理坐标传递给顶点着色器,然后将其传递给片段着色器,片段着色器整齐地插入每个片段的所有纹理坐标。

2.6.2 纹理包装

纹理坐标通常从范围(0,0)到(1,1),但如果我们指定此范围外的坐标发生了什么?OpenGL的默认行为是重复纹理图像(我们基本上忽略浮点纹理坐标的整数部分),但OpenGL提供了更多选项:

  1. GL_REPEAT:纹理的默认行为。重复纹理图像。
  2. GL_MIRRORED_REPEAT:与GL_REPEAT相同,但每次重复都会镜像图像。
  3. GL_CLAMP_TO_EDGE:夹住0和之间的坐标1。结果是更高的坐标被夹紧到边缘,导致拉伸的边缘图案。
  4. GL_CLAMP_TO_BORDER:范围之外的坐标现在被赋予用户指定的边框颜色。

当使用默认范围之外的纹理坐标时,每个选项都具有不同的视觉输出。让我们看一下样本纹理图像上的样子:

2.6.3 纹理过滤

纹理坐标不依赖于分辨率,但可以是任何浮点值,因此OpenGL必须找出哪个纹理像素(也称为 纹理元素)将纹理坐标映射到。如果我们有一个非常大的对象和一个低分辨率纹理,这一点变得尤为重要。OpenGL有这个选项纹理过滤同样。有几种选择,但现在我们将讨论最重要的选项:GL_NEAREST和GL_LINEAR。

GL_NEAREST(也称为最近邻过滤)是OpenGL的默认纹理过滤方法。设置为GL_NEAREST时,OpenGL选择中心最接近纹理坐标的像素。下面您可以看到4个像素,其中十字表示精确的纹理坐标。左上角纹理元素的中心最接近纹理坐标,因此被选为采样颜色:

GL_LINEAR(也称为(bi)线性滤波)从纹理坐标的相邻纹素中获取插值,近似纹理像素之间的颜色。从纹理坐标到纹理元素中心的距离越小,纹素的颜色对采样颜色的贡献就越大。下面我们可以看到返回相邻像素的混合颜色:

但是这种纹理过滤方法的视觉效果是什么?让我们看看在大对象上使用低分辨率的纹理时这些方法是如何工作的(因此纹理向上缩放,单个纹素明显):

GL_NEAREST导致阻塞模式,我们可以清楚地看到形成纹理的像素,而GL_LINEAR产生更平滑的模式,其中单个像素不太明显。GL_LINEAR产生更逼真的输出,但是一些开发人员更喜欢更多的8位外观,因此选择GL_NEAREST选项。

可以设置纹理过滤 放大 和 缩小文件操作(向上或向下放大时),例如,当纹理向下缩放时,您可以使用最近邻居过滤,对于放大的纹理,可以使用线性过滤。因此,我们必须为两个选项指定过滤方法glTexParameter*。

发布了80 篇原创文章 · 获赞 6 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览