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

OpenGL正在泄漏内存。哪个对象没有被释放?

  •  0
  • PPP  · 技术社区  · 7 年前

    你能确定问题出在哪里吗?

    PS:if中的东西实际上只运行一次,所以它的内存分配只发生一次

    这是我的OpenGL渲染函数:

    void OpenGlVideoQtQuickRenderer::render()
    {
        if (this->firstRun) {
            std::cout << "Creating QOpenGLShaderProgram " << std::endl;
            this->firstRun = false;
            program = new QOpenGLShaderProgram();
            initializeOpenGLFunctions();
            //this->m_F  = QOpenGLContext::currentContext()->functions();
    
            datas[0] = new unsigned char[width*height];     //Y
            datas[1] = new unsigned char[width*height/4];   //U
            datas[2] = new unsigned char[width*height/4];   //V
    
            std::cout << program->addShaderFromSourceCode(QOpenGLShader::Fragment, tString2) << std::endl;
            std::cout << program->addShaderFromSourceCode(QOpenGLShader::Vertex, vString2) << std::endl;
    
            program->bindAttributeLocation("vertexIn",A_VER);
            program->bindAttributeLocation("textureIn",T_VER);
            std::cout << "program->link() = " << program->link() << std::endl;
    
        }
        program->bind();
    
    
        glVertexAttribPointer(A_VER, 2, GL_FLOAT, 0, 0, ver);
        glEnableVertexAttribArray(A_VER);
    
        glVertexAttribPointer(T_VER, 2, GL_FLOAT, 0, 0, tex);
        glEnableVertexAttribArray(T_VER);
    
        unis[0] = program->uniformLocation("tex_y");
        unis[1] = program->uniformLocation("tex_u");
        unis[2] = program->uniformLocation("tex_v");
    
        glGenTextures(3, texs);
    
        //Y
        glBindTexture(GL_TEXTURE_2D, texs[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
    
        //U
        glBindTexture(GL_TEXTURE_2D, texs[1]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height / 2, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
    
        //V
        glBindTexture(GL_TEXTURE_2D, texs[2]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width / 2, height / 2, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
    
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texs[0]);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RED, GL_UNSIGNED_BYTE, datas[0]);
        glUniform1i(unis[0], 0);
    
    
        glActiveTexture(GL_TEXTURE0+1);
        glBindTexture(GL_TEXTURE_2D, texs[1]); 
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width/2, height / 2, GL_RED, GL_UNSIGNED_BYTE, datas[1]);
        glUniform1i(unis[1],1);
    
    
        glActiveTexture(GL_TEXTURE0+2);
        glBindTexture(GL_TEXTURE_2D, texs[2]);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width / 2, height / 2, GL_RED, GL_UNSIGNED_BYTE, datas[2]);
        glUniform1i(unis[2], 2);
    
        glDrawArrays(GL_TRIANGLE_STRIP,0,4);
        program->disableAttributeArray(A_VER);
        program->disableAttributeArray(T_VER);
        program->release();
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   BDL Vyxzl    7 年前

    glGenTextures )没有释放他们( glDeleteTextures )。或者在渲染方法结束时删除它们,或者更好:在第一个块中只创建一次纹理,然后只向其上载新数据。

    glVertexAttribPointer 仅在核心概要文件之前的OpenGL中有效。我强烈建议改为使用顶点缓冲区对象。