Textured glDrawElement

Textured glDrawElement

本文关键字:glDrawElement Textured      更新时间:2023-10-16

我在制作 3D 模型纹理时遇到了问题,我只是潜入 3D 模型,因为我一直在使用基本基元进行测试,并且一直在研究更多特定于引擎的代码。但是,我在使用 glDrawElements 函数时遇到了问题,我知道我的纹理已正确加载,因为我能够将其绘制为四边形(请注意注释中的 glBegin(。但是,当使用glDrawElements时,我没有得到绘制的纹理。它确实显示了部分纹理的颜色(黄色(,当我删除纹理代码时,它将 3D 模型返回到已设置的最后一个颜色,因此它正在执行某些操作。我在想也许这与我的glVertexAttributePointer 有关,我明白这些函数的作用。

glMatrixMode(GL_MODELVIEW);
    glMultMatrixf(m_Props.WorldMatrix.data);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), 0);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)12);
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)20);
    glBindBuffer(GL_ARRAY_BUFFER, pExtra->GetVB());
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pExtra->GetIB());
    glScalef(0.05, 0.05, 0.05);
    glEnable(GL_TEXTURE_2D);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, pTexExtra->GetTexture());
     glDrawElements(GL_TRIANGLES, pExtra->GetIndexCount(), GL_UNSIGNED_INT, 0); 
     /*glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(0.0f, 0.0f, 0.0f);
        glTexCoord2f(0, 1); glVertex3f(10.0f, 0.0f, 0.0f);
        glTexCoord2f(1, 1); glVertex3f(10.0f, 10.0f, 0.0f);
        glTexCoord2f(1, 0); glVertex3f(0.0f, 10.0f, 0.0f);
     glEnd();*/
    glDisable(GL_TEXTURE_2D);

    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);

我的 VertexPTN 类只是位置、纹理坐标和法线的容器。所以我假设我的向量在类中的位置;Vector3f, Vector2f, Vector3f, 我会将 glVertexAttributePointer 的最后一个参数设置为 0, 12, 20。

对我错过的任何东西有什么误解吗?我真的不是openGL的专业人士,但我确实了解相当多的设置和基本渲染。是什么原因导致我的纹理无法渲染到我的网格,即未设置的 GL 状态?

一些想法:

你正在使用着色器吗? glVertexAttribPointer 仅适用于着色器

  • 如果是: 您确定输入为 0、1 和 2 吗?如果在着色器与 glBindAttribLocation 链接之前未设置这些值,则不能保证它们是任何特定值。
  • 如果否:您应该使用 glVertexPointer、glTexCoordPointer 等,而不是AttribPointer

此外,如果您使用的是着色器,则启用/禁用GL_TEXTURE_2D是多余的,它不会执行任何操作。

相关文章: