我是一个原始的纹理贴图,准确地说是四边形。我有一个问题,纹理以某种方式旋转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);
导致这种行为的原因是什么?我真的不认为这会对绘图产生这样的影响。
答案 0 :(得分:2)
我真的不认为这会对绘图产生这样的影响。
想一想。 glTexCoord
做了什么?它指定纹理坐标,对吗?但纹理坐标是什么?
是的,你知道它指定下一个顶点的纹理坐标,但OpenGL不知道。所有glTexCoord
都会将您传递给它的值设置为一块内存。
glVertex
做更多事情。它设置顶点位置,但它也告诉OpenGL,“获取我到目前为止设置的所有顶点值并用它渲染一个顶点。”这就是为什么你不能在glVertex
之外拨打glBegin/glEnd
,即使你可以使用glTexCoord
,glColor
等进行此操作。
所以当你执行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)右上角