代码之家  ›  专栏  ›  技术社区  ›  Tom

如何在OpenGL(2.1)中将纹理添加到顶点缓冲区对象

  •  1
  • Tom  · 技术社区  · 9 年前

    在OpenGL2.1中纹理映射对象的正确方法是什么?目前,我正在执行以下步骤,但无法使纹理正确显示在对象上。

    1. 生成缓冲区并存储ID
    2. 绑定缓冲区
    3. 将数据上载到缓冲区
    4. 每次渲染缓冲区中的对象时:

      4.1.启用 GL_TEXTURE_2D , GL_VERTEX_ARRAY GL_TEXTURE_COORD_ARRAY

      4.2.绑定纹理,然后绑定缓冲区

      4.3设置 glTexCoordPointer 然后设置 glVertexPointer

      4.4使用 glDrawArrays 渲染对象

      4.5通话 glFlush

    创建VBO的代码:

    GLuint flagVBO;
    glGenBuffers(1, &flagVBO);
    glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(flag), (void*) flag, GL_STATIC_DRAW);
    

    用于呈现VBO的代码:

    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
    glBindTexture(GL_TEXTURE_2D, gameManager->getTextureManager().getTexture("poleEndFlag")); //The get texture method returns 2 which is the correct texture
    glColor3f(1.0, 1.0, 1.0);
    
    glBindBuffer(GL_ARRAY_BUFFER, flagVBO);
    glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*)3);
    glVertexPointer(3, GL_FLOAT, sizeof(float)*5, (GLvoid*)0);
    glDrawArrays(GL_QUADS, 0, sizeof(flag) / sizeof(float) / 5);
    glFlush();
    
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisable(GL_TEXTURE_2D);
    

    flagVBO阵列:

    flag[120] = {
        //Bottom
        -0.1, 1.4, 0.025, 1, 1,
        -0.8, 1.4, 0.025, 0, 1,
        -0.8, 1.4, -0.025, 0, 0,
        -0.1, 1.4, -0.025, 1, 0,
        //Top
        -0.1, 1.95, 0.025, 1, 1,
        -0.8, 1.95, 0.025, 0, 1,
        -0.8, 1.95, -0.025, 0, 0,
        -0.1, 1.95, -0.025, 1, 0,
        //Front
        -0.1, 1.4, 0.025, 1, 0,
        -0.8, 1.4, 0.025, 0, 0,
        -0.8, 1.95, 0.025, 0, 1,
        -0.1, 1.95, 0.025, 1, 1,
        //Back
        -0.1, 1.4, -0.025, 1, 0,
        -0.8, 1.4, -0.025, 0, 0,
        -0.8, 1.95, -0.025, 0, 1,
        -0.1, 1.95, -0.025, 1, 1,
        //Left
        -0.8, 1.95, 0.025, 1, 1,
        -0.8, 1.4, 0.025, 0, 1,
        -0.8, 1.4, -0.025, 0, 0,
        -0.8, 1.95, -0.025, 1, 0,
        //Right
        -0.1, 1.95, 0.025, 1, 1,
        -0.1, 1.4, 0.025, 0, 1,
        -0.1, 1.4, -0.025, 0, 0,
        -0.1, 1.95, -0.025, 1, 0
    }
    

    看起来顶点坐标渲染正确,但tex坐标不正确。对象渲染为与纹理中的主颜色相同的颜色,但整个纹理不存在。

    The image shows the rendered object on the left and the texture it should have on the right

    图像在左侧显示渲染对象,在右侧显示其应有的纹理

    1 回复  |  直到 9 年前
        1
  •  3
  •   derhass    9 年前

    纹理坐标指针错误。偏移量为 字节 。您指定的3个字节位于顶点位置的x和y坐标之间。正确的值应该是

    glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*) (3*sizeof(GLfloat)) );