C++ OpenGL纹理三角形

C++ OpenGL纹理三角形,c++,opengl,C++,Opengl,我有一个由三角形组成的大正方形。我正在尝试对这个大正方形进行纹理处理,我得到的(似乎)是一个单像素列,然后在基本体上拉伸 我正在使用UV坐标(0,1)、(0,0)、(1,0)和(0,1)、(1,1)、(1,0)对每个直角三角形进行纹理处理,具体取决于三角形向上的方向 呈现代码 glBindTexture(GL_TEXTURE_2D, m_texture.id()); //glEnableClientState(GL_INDEX_ARRAY); glEnableClien

我有一个由三角形组成的大正方形。我正在尝试对这个大正方形进行纹理处理,我得到的(似乎)是一个单像素列,然后在基本体上拉伸

我正在使用UV坐标(0,1)、(0,0)、(1,0)和(0,1)、(1,1)、(1,0)对每个直角三角形进行纹理处理,具体取决于三角形向上的方向

呈现代码

    glBindTexture(GL_TEXTURE_2D, m_texture.id());

    //glEnableClientState(GL_INDEX_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    //glIndexPointer(GL_INT, 0, &m_indices[0]);
    glVertexPointer(3, GL_FLOAT, sizeof(VertexData), &m_vertexData[0].x);
    glNormalPointer(GL_FLOAT, sizeof(VertexData), &m_vertexData[0].nx);
    glTexCoordPointer(2, GL_FLOAT, sizeof(UVData), &m_uvData[0].u);

    glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, &m_indices[0]);
    glBindTexture(GL_TEXTURE_2D, 0);
纹理是包裹模式是“GL_夹紧到_边缘”

编辑

输出我得到的前两个三角形值

三角形1:

指数(0,1,31)

顶点0(-15,0,-15),顶点1(-15,0,-14),顶点31(-14,0,-14)

紫外线(0,1)、(0,0)、(1,0)

三角形2:

指数(0,30,31)

顶点0(-15,0,-15),顶点30(-14,0,-15)顶点31(-14,0,-14)

紫外线(0,1)、(1,1)、(1,0)

对于后代来说,完整的代码是


这两个三角形组成一个正方形,对角线从左上到右下切。

不要使用glIndexPointer,它不是您所认为的,用于颜色索引模式,要创建索引网格,只需使用GldUnderElements。

看起来您将UV数据与索引关联,而不是与顶点关联。UV数据是顶点数据的一部分,因此您可能应该将其打包到VertexData对象中,而不是将其分开。你可以把它分开,但你需要每个顶点一个,而不是每个索引一个。

lol谢谢,这就是我的讲师向我们展示如何使用它的方式,他非常需要再次学习这个主题。它不能解决我的问题,因为:(你仍然不应该为索引数组启用客户端状态。@吉姆·巴克,我不再是了,我忘了在上面的帖子中注释掉启用。所有索引数组都消失了,我仍然留下一个奇怪的纹理。@Arasumsen VertexData是一个结构,它保存Vertex数据和法线,float x,y,z,nx,ny,nz。它将正确地绘制基本体b但纹理不正确。@PhilCK尝试删除sizeof(UVData),并将其更改为0。让我知道它的作用。你是说UV0、UV1、UV31、UV0、UV30和UV31,对吗?@Arasumssen,你对UV0、1、31的看法是正确的,我通过了0、1、2。我不理解索引。我想我每个顶点只能有一个UV值。对。所以,你真的应该把它和你的VertexData一起打包。谢谢你的帮助,现在我上床睡觉了。