c++ - 加载着色器后清除内存

标签 c++ opengl glsl shader

尽管我按照建议的步骤进行操作,但还是发生了内存泄漏。我按如下方式加载和删除着色器:

glCreateShader
glShaderSource
glCompileShader
glAttachShader
glLinkProgram
glUseProgram
glDetachShader
glDeleteShader
glUseProgram(0);
glDeleteProgram
当我循环执行所有这些步骤时,

glLingProgram() 似乎会导致泄漏。下面是我的测试代码。你能帮我找出问题所在吗? (代码基于 http://opengl-tutorial.org/ 上的教程)。

编辑:我认为只有当顶点着色器包含 attribute 类型时才会发生这种情况。

for (int i = 0; i < 1000; i++) {
    GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);

    std::string VertexShaderCode;
    std::ifstream VertexShaderStream("VertexShader.vs", std::ios::in);
    if(VertexShaderStream.is_open()) {
        std::string Line = "";
        while(getline(VertexShaderStream, Line))
            VertexShaderCode += "\n" + Line;
        VertexShaderStream.close();
    }
    else {
        printf("Cannot open vertex shader!");
        getchar();
        return 0;
    }

    std::string FragmentShaderCode;
    std::ifstream FragmentShaderStream("FragmentShader.fs", std::ios::in);
    if(FragmentShaderStream.is_open()) {
        std::string Line = "";
        while(getline(FragmentShaderStream, Line)) {
            FragmentShaderCode += "\n" + Line;
        }
        FragmentShaderStream.close();
    }
    else {
        printf("Cannot open fragment shader!");
        getchar();
        return 0;
    }

    char const * VertexSourcePointer = VertexShaderCode.c_str();
    glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
    glCompileShader(VertexShaderID);

    char const * FragmentSourcePointer = FragmentShaderCode.c_str();
    glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
    glCompileShader(FragmentShaderID);

    GLuint ProgramID = glCreateProgram();

    glAttachShader(ProgramID, VertexShaderID);
    glAttachShader(ProgramID, FragmentShaderID);

    glLinkProgram(ProgramID);

    glUseProgram(ProgramID);

    glDetachShader(ProgramID, VertexShaderID);
    glDetachShader(ProgramID, FragmentShaderID);

    glDeleteShader(VertexShaderID);
    glDeleteShader(FragmentShaderID);

    glUseProgram(0);

    glDeleteProgram(ProgramID);
}

最佳答案

您应该只在开始时加载着色器。只有 glUseProgram 旨在用于渲染循环。

使用着色器的标准模板是这样的:

glCreateProgram
glCreateShader
glShaderSource
glCompileShader
glAttachShader
glLinkProgram <- after this line opengl got everything it needs, 
                 you can free shader resources
glDetachShader
glDeleteShader

for{//render loop
   glUseProgram
   //...drawing operations
   glUseProgram(0);
}

glDeleteProgram

关于c++ - 加载着色器后清除内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23496773/

相关文章:

c++ - 模板类 "Copy Constructor"

c++ - 当我在 Debug模式下编译时,丰富的编辑控件格式不起作用

c++ - 错误 : 'my_texture' does not name a type

c++ - OpenGL 动画似乎偶尔会丢失骨骼数据

OpenGL 着色语言向后兼容性

image-processing - OpenGL GLSL : How to implement the concept of gradient map in photoshop using fragment shader?

c++ - 为什么我们不能在类中声明命名空间别名?

c++ - 没有进位标志的大整数加法

opengl - Haskell:数据/类型构造函数不在范围内,但数据构造函数在范围内

c++ - 战俘(1,信息)==南?