c++ - OpenGL 中的复杂纹理映射?

标签 c++ opengl mapping textures

在具有以下参数的 OpenGL 中使用纹理

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

并像这样映射它:

glBegin( GL_QUADS );
glTexCoord2f( 3.0, 2.0 ); glVertex2f( -2.0, 2.0 ); // P1
glTexCoord2f( 0.0, 2.0 ); glVertex2f( -2.0, -1.0 ); // P2
glTexCoord2f( 0.0, 0.0 ); glVertex2f( 2.0, -2.0 ); // P3
glTexCoord2f( 3.0, 0.0 ); glVertex2f( 2.0, 1.0 ); // P4
glEnd( );

我不确定最终结果会是什么样子。我了解 glTexCoord 中大于 1 的值如何使纹理在 x 轴上重复,而 0 和 1 纹素将在 y 轴上重复。我对在这种情况下如何映射纹理感到困惑。会不会倒退?我似乎无法在互联网上找到任何类似的例子......

最佳答案

请记住,您的环绕模式适用于纹理坐标(s 和t),而不适用于x 轴和y 轴。您的属性指定 s 坐标环绕,t 坐标夹紧。

将此应用于您的坐标(基于纸质草图),您的 s 坐标沿着从 P3 到 P4 的边缘以及从 P2 到 P1 的边缘从 0.0 变为 3.0。这些边沿 y 轴方向。由于您为 s 坐标指定了 REPEAT,并且 s 坐标对应于纹理中的水平方向,因此纹理的原始从左到右方向将与 y 轴对齐你的渲染,图像将在这个方向上重复 3 次。

同样,您的 t 坐标沿着从 P3 到 P2 的边缘以及从 P4 到 P1 的边缘从 0.0 到 2.0。在您的渲染坐标系中,这些边缘从右到左并略微向上。由于您为 t 坐标指定了 CLAMP,并且 t 坐标对应于纹理中的垂直方向,因此渲染四边形的右侧将显示从上到下(或从下到下)的纹理顶部,取决于您的纹理的存储方式)方向,四边形的左侧将重复纹理的顶部/底部像素行。

这在文字解释时听起来有点令人费解,但实际上并没有那么复杂。用白板上的几张草图来解释会容易得多。

关于c++ - OpenGL 中的复杂纹理映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23123639/

相关文章:

qt - ubuntu 上的 QGLWidget 什么也没显示

OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

使用泛型函数的映射对 Seq 进行排序的 Scala 函数

ios - 将 API 错误代码映射到 iOS 中的本地化字符串

c++ - 如何在*成员被销毁后*在析构函数中执行一些代码

c++ - 如何使用opencv函数计算图像(二进制)的孔数

c++ - 我需要调整指针数组的大小

c++ - Eigen :累积可变大小的数组

c++ - 渲染具有透明度的纹理时 OpenGL 不需要的像素

.net - 嵌套映射的 AutoMapper 展平要求自定义解析器