如何渲染多个纹理?

Posted

技术标签:

【中文标题】如何渲染多个纹理?【英文标题】:How to render multiple textures? 【发布时间】:2014-03-22 11:49:01 【问题描述】:

我试图了解如何在 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 放在其他地方还是需要更改其他内容。

【问题讨论】:

【参考方案1】:

这里有一些误解,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);
 

【讨论】:

所以 glActivate 是针对同一个物体上的多个纹理? @Ruben 对。更改对象之间的纹理是通过绑定它们来完成的。 glActiveTexture 设置受 glBindTexture 调用影响的“纹理位置”,但由于每个对象只使用一个纹理,因此可以放心地忽略它。

以上是关于如何渲染多个纹理?的主要内容,如果未能解决你的问题,请参考以下文章

尝试渲染到多个纹理以实现延迟渲染。但所有纹理都是平等的

OpenGL渲染到多个纹理,结果是白色的

OpenGL:使用多个纹理渲染到 FBO

如何在三个js中将多个纹理裁剪为多边形

在不使用点精灵的情况下在屏幕上的不同点渲染多个纹理

OpenGL:如何将多个纹理传递给具有一个变量的着色器?