【问题标题】:Complex texture mapping in OpenGL?OpenGL中的复杂纹理映射?
【发布时间】:2014-04-17 02:40:15
【问题描述】:

在 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 轴上重复。我对在这种情况下如何映射纹理感到困惑。会倒退吗?我好像在网上找不到类似的例子……

【问题讨论】:

    标签: c++ opengl mapping textures


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      首先,您必须想象在此示例中顶点本身是如何连接的。因为 S 和 T 坐标只不过是您从中获取纹素的纹理中的 where。它们与任何一般空间轴无关(尽管它们可用于创建自己的特殊轴),它们实际上只是沿多边形表面插值的坐标。

      现在,由于您在这里处理的是四边形,因此讨论这些纹理坐标的插值比实际需要的要复杂一些。相反,让我们考虑一个漂亮的三角形 (P1,P2,P3)... 沿着边 P1,P2,T 坐标是恒定的,S 坐标范围从 3.0 到 0.0(纹理沿此边缘在S 方向重复三次)。

      对所有边缘重复此操作,以大致了解纹理沿边缘的行为,然后查找重心坐标以了解坐标是如何在三角形内部插值的。

      这是一个粗略的图表,说明了实现重心插值的数学:


      (来源:docstoccdn.com

      【讨论】:

        猜你喜欢
        • 2011-05-04
        • 2011-03-16
        • 1970-01-01
        • 2011-08-25
        • 2012-07-28
        • 2011-05-16
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多