具有多个textu的OpenGL帧缓冲区

2024-09-24 12:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的程序中渲染n纹理并存储它们以备以后使用。因此,我使用OpenGL FramebufferObject。在

首先,我创建一个包含128个纹理的数组,如下所示

self.textures = glGenTexture(128)

第二步是一个有128次迭代的循环,在这个循环中,我在位置I绑定纹理并将其渲染到其中。在

^{pr2}$

最后一步是另一个循环,主游戏循环,在这个循环中,我用纹理数组中的一个纹理渲染一个平面。在

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0,0,1,0,0,0,0,1,0)
    glEnable(GL_TEXTURE_2D)

    glBindTexture(GL_TEXTURE_2D, self.texture[i])

    glBegin(GL_QUADS)

    glNormal3f(0.0, 1.0, 0.0)
    glTexCoord2f(0.0, 0.0)
    glVertex3f(-1, 1, -1)
    glTexCoord2f(1.0, 0.0)
    glVertex3f(1, 1, -1)
    glTexCoord2f(1.0, 1.0)
    glVertex3f(1, -1, -1)
    glTexCoord2f(0.0, 1.0)
    glVertex3f(-1, -1, -1)

    glEnd();

    glDisable(GL_TEXTURE_2D)

但是出了点问题,屏幕一直是黑色的。在


Tags: self程序bufferbit数组opengl纹理gl
1条回答
网友
1楼 · 发布于 2024-09-24 12:30:21

纹理用作帧缓冲区对象的颜色附件时,不得绑定。然而,你是捆绑它之前附加,这当然打破了整个事情。在

正确的代码将遍历所有的多重纹理单元,并确保纹理没有绑定在其中任何一个单元中。在

因评论而更新:

在代码中绑定纹理名称并为其设置参数

glBindTexture(GL_TEXTURE_2D, self.texture[i])
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST)

然后用空数据初始化纹理对象

^{pr2}$

最后将其附加为帧缓冲区附件。在

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,  GL_TEXTURE_2D, self.texture[i], 0);

问题是,现在纹理仍然被选择为数据源,因为它是绑定的。纹理不能绑定到任何纹理单元,以用作帧缓冲区颜色附件。此外,FBO必须作为渲染目标绑定到某处。在

renderScene()

下面是一个小的辅助函数,它可以确保给定的纹理对象不绑定在任何纹理单元中:

def glhelperUnbindTexture(target, name):
    max_units = max(glGetInteger(GL_MAX_TEXTURE_UNITS),
                    glGetInteger(GL_MAX_TEXTURE_IMAGE_UNITS),
                    glGetInteger(GL_MAX_TEXTURE_COORDS))
    current_unit = glGetInteger(GL_ACTIVE_TEXTURE)

    for i in range(max_units):
        glActiveTexture(GL_TEXTURE0 + i)
        binding = glGetInteger( {GL_TEXTURE_1D: GL_TEXTURE_BINDING_1D,
                                 GL_TEXTURE_2D: GL_TEXTURE_BINDING_2D,
                                 GL_TEXTURE_3D: GL_TEXTURE_BINDING_3D,
                                 GL_TEXTURE_CUBE_MAP: GL_TEXTURE_BINDING_CUBE_MAP}[target])
        if binding == name:
             glBindTexture(target, 0) # this unbinds the texture from the texturing unit

    glActiveTexture(current_unit)

相关问题 更多 >