0

我无法让我的 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 状态?

4

1 回答 1

0

一些想法:

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

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

此外,如果您使用着色器,则启用/禁用 GL_TEXTURE_2D 是多余的,它不会做任何事情。

于 2012-05-15T01:16:23.350 回答