使用openGL进行纹理映射

时间:2012-04-17 18:07:09

标签: c++ opengl

我是一个原始的纹理贴图,准确地说是四边形。我有一个问题,纹理以某种方式旋转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 个答案:

答案 0 :(得分:2)

  

我真的不认为这会对绘图产生这样的影响。

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

是的,知道它指定下一个顶点的纹理坐标,但OpenGL不知道。所有glTexCoord都会将您传递给它的值设置为一块内存。

glVertex做更多事情。它设置顶点位置,但它告诉OpenGL,“获取我到目前为止设置的所有顶点值并用它渲染一个顶点。”这就是为什么你不能在glVertex之外拨打glBegin/glEnd,即使你可以使用glTexCoordglColor等进行此操作。

所以当你执行glTexCoord(...); glVertex(...)时,你会说“将当前纹理坐标设置为X,然后将位置设置为Y并使用这些值进行渲染。”当你执行glVertex(...); glTexCoord(...);时,你会说,“将位置设置为Y并使用先前设置的值进行渲染,然后将当前纹理坐标设置为X.”

在你告诉OpenGL呈现顶点之后设置纹理坐标有点晚了。

答案 1 :(得分:0)

你调用glVertex和glTexCoord的顺序绝对重要!每当您指定顶点属性(如glTexCoord,glColor等)时,它们将应用您绘制的所有未来顶点,直到您再次更改其中一个属性。所以在前面的例子中,你的第一个顶点是用一些未指定的前一个tex coord绘制的,第二个顶点是tex coord(0.0,1.0)等。

答案 2 :(得分:0)

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

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

将来,请确保在调用使用这些状态的函数之前设置正确的GL状态,并且应该很好。

答案 3 :(得分:0)

可能最好的解释是在线:Texture mapping - Tutorial

还要确保纹理坐标(texCoor)如下:

他们被称为重要的顺序!

  
      
  • (0,0)左下角
  •   
  • (0,1)左上角
  •   
  • (1,0)右下角
  •   
  • (1,1)右上角
  •