纹理映射问题OpenGL GLUT

时间:2014-09-25 08:47:33

标签: c++ object opengl textures glut

我有一个简单的对象(box.obj),它本质上是一个立方体,但由50个左右的向量,法线和纹理坐标组成。

然后我有一个砖块jpeg纹理,我想映射到它:

我使用jpeglib将图像导入纹理,并且一切正常,我的问题是纹理如何映射到多维数据集。这就是它最终看起来像:

注意前面和顶部的奇怪的卷曲边和大砖。我正在对表格做同样的事情。在立方体下方,它应该具有木质纹理,但它模糊/阻挡。

这是我用来获取对象/纹理的解析器。这在显示功能中被调用。

for (int i = 0; i < m_nNumPolygon; i++) {
    glBegin(GL_TRIANGLES);
    glTexCoord2f(m_pUVArray[m_pTriangles[i].v1].u, m_pUVArray[m_pTriangles[i].v1].v);
    glNormal3f(m_pNormalArray[m_pTriangles[i].n1].x,
            m_pNormalArray[m_pTriangles[i].n1].y,
            m_pNormalArray[m_pTriangles[i].n1].z);
    glVertex3f(m_pVertexArray[m_pTriangles[i].v1].x,
            m_pVertexArray[m_pTriangles[i].v1].y,
            m_pVertexArray[m_pTriangles[i].v1].z);
    glTexCoord2f(m_pUVArray[m_pTriangles[i].v2].u, m_pUVArray[m_pTriangles[i].v2].v);
    glNormal3f(m_pNormalArray[m_pTriangles[i].n2].x,
            m_pNormalArray[m_pTriangles[i].n2].y,
            m_pNormalArray[m_pTriangles[i].n2].z);
    glVertex3f(m_pVertexArray[m_pTriangles[i].v2].x,
            m_pVertexArray[m_pTriangles[i].v2].y,
            m_pVertexArray[m_pTriangles[i].v2].z);
    glTexCoord2f(m_pUVArray[m_pTriangles[i].v3].u, m_pUVArray[m_pTriangles[i].v3].v);
    glNormal3f(m_pNormalArray[m_pTriangles[i].n3].x,
            m_pNormalArray[m_pTriangles[i].n3].y,
            m_pNormalArray[m_pTriangles[i].n3].z);
    glVertex3f(m_pVertexArray[m_pTriangles[i].v3].x,
            m_pVertexArray[m_pTriangles[i].v3].y,
            m_pVertexArray[m_pTriangles[i].v3].z);
    glEnd();
}

如果我需要发布更多代码,请告诉我,例如。如何阅读对象或诸如此类的东西!

1 个答案:

答案 0 :(得分:1)

我认为你提供了错误的纹理坐标。

您可以在相邻面之间共享顶点,但不能共享纹理坐标。 要想象这个问题,请看这个图像

http://www.ozone3d.net/~geeks3d/public/satyr/200909/gettingstartedwithblender3/images/TutoScene.001_Cube.png

http://wiki.thedarkmod.com/images/thumb/f/fe/Cube_Representative_UV_Unwrapping.png/800px-Cube_Representative_UV_Unwrapping.png

尝试通过理解此图像来分配顶点。它基本上将立方体对象展开到纹理平面上。

因此,请考虑将纹理指定为背面的情况。如果你给出了左,右,下和上面的纹理协调,那么最终会粘贴单面上所有四个面的整个纹理。

因此,最终会粘贴左边的立方体中的卷曲纹理。 看一下图像并尝试理解为什么分配给中间一行第一面左边缘的纹理坐标不能被合成到第四面的右边缘。

希望它有所帮助。