c++ - 如何渲染多个纹理?

标签 c++ c opengl opengl-4

我正在尝试了解如何在 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 调用是为了在绘制同一对象时管理多个纹理。对于不同的对象,您只需绑定(bind)不同的纹理即可。只需在设置纹理时删除对 ActiveTexture 的调用(或确保在绘制时它始终为 0)。然后,在绘制时:

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

关于c++ - 如何渲染多个纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22577187/

相关文章:

c++ - 用于 C++ 中的初始化的 memset

c - if 语句段错误

c++ - GLFW 无响应全屏窗口

c++ - 使用 openGL、C++ 绘制/渲染的替代方法

c++ - 可以使用 realloc 安全地重新分配普通可复制对象的存储吗?

c++ - 我可以使用 Qt 检测 QWERTY/AZERTY 键盘吗?

c++ - 如何构建解析树?

c++ - C、编译错误和指针

c - 大数据集散列和C实现

java - 尽管链接和验证成功,为什么着色器程序无法编译?