0

我正在纹理映射一个图元,确切地说是一个四边形。我遇到了纹理以某种方式逆时针方向旋转 90 度的问题。我以为问题出在纹理的加载代码上,但事实证明这实际上是绘制函数的问题。所以这是错误地绘制图片的代码:

glVertex2f(0.0f, 0.0f); glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.5f, 0.0f); glTexCoord2f(1.0f, 1.0f);
glVertex2f(0.5f, 0.5f); glTexCoord2f(1.0f, 0.0f);
glVertex2f(0.0f, 0.5f); glTexCoord2f(0.0f, 0.0f);

这个画出来的就像我打算画的那样:

glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5f, 0.5f);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.5f);

是什么导致了这种行为?我真的没想到这会对绘画产生这样的影响。

4

4 回答 4

2

我真的没想到这会对绘画产生这样的影响。

想想看。做什么glTexCoord?它指定了纹理坐标,对吗?但是纹理坐标是什么?

是的,知道它指定了下一个顶点的纹理坐标,但 OpenGL 不知道。所做glTexCoord的只是将您传递给它的值设置到一块内存中。

glVertex做更多的事情。它设置顶点位置,但它告诉 OpenGL,“获取我目前设置的所有顶点值并用它渲染一个顶点。” 这就是为什么你不能glVertex在外面打电话的原因glBegin/glEnd,即使你可以glTexCoord,glColor等等来做。

因此,当您这样做时glTexCoord(...); glVertex(...),您是在说“将当前纹理坐标设置为 X,然后将位置设置为 Y 并使用这些值进行渲染。” 当您这样做时glVertex(...); glTexCoord(...);,您是在说“将位置设置为 Y 并使用先前设置的值进行渲染,然后将当前纹理坐标设置为 X。”

在你已经告诉 OpenGL 渲染一个顶点之后设置纹理坐标有点晚了。

于 2012-04-17T18:20:24.790 回答
0

您调用 glVertex 和 glTexCoord 的顺序绝对重要!每当您指定顶点属性(如 glTexCoord、glColor 等)时,它们都会应用您绘制的所有未来顶点,直到您再次更改其中一个属性。因此,在前面的示例中,您的第一个顶点是使用一些未指定的先前 tex 坐标绘制的,第二个顶点使用 tex 坐标 (0.0, 1.0) 等进行绘制。

于 2012-04-17T18:11:47.837 回答
0

OpenGL 以状态方式运行。许多 GL 函数调用用于更改当前状态,以便当您调用其他一些函数时,它们可以使用当前状态进行正确的操作。

在您的情况下, glVertex2f() 调用使用当前纹理状态来定义纹理的哪个部分映射到哪个顶点。在您的第一个调用系列中,对 glVertex2f() 的第一次调用将没有先前的纹理状态,因此它可能默认为 (0.0f, 0.0f),尽管它也可能是未定义的行为。然后第二次调用 glVertex2f 将使用第一次调用 glTexCoord2f() 设置的状态,然后第三次调用 glVertex2f() 使用第二次调用 glTexCoord2() 设置的状态,依此类推。

将来,请确保在调用使用这些状态的函数之前设置正确的 GL 状态,您应该一切顺利。

于 2012-04-17T18:16:52.217 回答
0

可能是网上最好的解释:纹理映射 - 教程

而且也只是为了确保纹理坐标(texCoor)如下:

它们被称为的顺序很重要!

  • (0,0) 左下角
  • (0,1) 左上角
  • (1,0) 右下角
  • (1,1) 右上角
于 2012-04-17T22:11:43.257 回答