我正在为一个基元贴图,准确地说是一个四边形。我遇到了纹理以某种方式逆时针旋转 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);
是什么导致了这种行为?我真的没有想到这会对绘图产生这样的影响。
最佳答案
I really didn't think this would have such effects to the drawing.
想一想。 glTexCoord
有什么作用?它指定了纹理坐标,对吗?但是纹理坐标是什么?
是的,您知道它指定了下一个顶点的纹理坐标,但 OpenGL 并不知道。 glTexCoord
所做的就是将您传递给它的值设置到一 block 内存中。
glVertex
做的更多。它设置顶点位置,但它还告诉 OpenGL,“获取我目前设置的所有顶点值并用它渲染一个顶点。”这就是为什么你不能在 glBegin/glEnd
之外调用 glVertex
,即使你可以用 glTexCoord
做到这一点, glColor
等
所以当你执行 glTexCoord(...); glVertex(...)
,您是说“将当前纹理坐标设置为 X,然后将位置设置为 Y 并使用这些值进行渲染。”当你执行 glVertex(...); glTexCoord(...);
,您是说,“将位置设置为 Y 并使用先前设置的值进行渲染,然后将当前纹理坐标设置为 X。”
在您已经告诉 OpenGL 渲染一个顶点之后设置纹理坐标有点晚了。
关于c++ - 使用 openGL 进行纹理映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10196588/