纹理glDrawElement

时间:2012-05-15 00:28:41

标签: c++ opengl vertex-attributes

我无法将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类只是Position,Texture Coordinate和Normal的容器。所以我假设我的向量在课堂上的位置; Vector3f,Vector2f,Vector3f,我将glVertexAttributePointer的最后一个参数设置为0,12,20。

对于我遗失的任何事情有什么误解吗?我真的不喜欢openGL,但我确实理解了相当多的设置和基本渲染。是什么导致我的纹理不渲染到我的网格,一个未设置的GL状态?

1 个答案:

答案 0 :(得分:0)

一些想法:

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

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

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