如何渲染多个纹理

How to render multiple textures?

本文关键字:纹理 何渲染      更新时间:2023-10-16

我试图了解如何在OpenGL中为不同的对象渲染多个纹理。我决定简单地尝试一下,据我所知,glActivate是用来选择正确的纹理的,但它并没有像我预期的那样工作。在我的代码中,显示了两个对象(依次),但它们具有相同的纹理。这是代码的纹理初始化部分:

bool (some args, unsigned int textureUnit, bool wrap)
{
    // some code
    OpenGL->glActiveTexture (GL_TEXTURE0 + textureUnit);
    glGenTextures (1, &textureID);
    glBindTexture (GL_TEXTURE_2D, textureID);
    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, targaImage);
    if (wrap) {
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    } 
    else {
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    }
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    OpenGL->glGenerateMipmap (GL_TEXTURE_2D);
}

textureUnit对于第一个纹理是0,对于第二个是1。模型渲染代码:

{
    OpenGL->glBindVertexArray (vertexArrayId);
    glDrawElements (GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
}

将glActive放在那部分之间或之前不会改变任何事情。所以我的问题是,如何渲染多个纹理?我应该把glActivate放到别的地方吗?或者我需要改变别的东西吗?

这里有一些误解,glActiveTexture调用是用于在绘制相同对象时管理多个纹理。对于不同的对象,你只需要绑定不同的纹理。当设置纹理时,只需删除对ActiveTexture的调用(或确保在绘制时它始终为0)。然后,绘制时:

{
    OpenGL->glBindVertexArray (vertexArrayId);
    glBindTexture(GL_TEXTURE_2D, textureID);     /* this has to be set somehow */
    glDrawElements (GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
}