c++ - OpenGL3 : Clean-up after failed shader compilation

标签 c++ opengl opengl-3

编译顶点或片段着色器时,是否应该在编译失败的着色器上调用 glDeleteShader() 函数,还是仅适用于成功编译的着色器?

例如,使用着色器

const GLchar* vertexSource =
    "#version 150 core\n"
    "in vec2 position;" // Vertices specified in 2 dimensions: (X, Y)
    "void main()"
    "{"
    "    gl_Position = vec4(position, 0.0, 1.0)"  // Removed semicolon here
    "}";

由于缺少分号而损坏,与:

GLuint vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);

glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);

GLint success;

glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

if (!success) {
    GLchar infoLog[512];
    glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
    std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}

将由于语法错误而触发 if 子句:错误:语法错误,意外的“}”,期望“,”或“;”

我尝试在 if 子句中添加 glDeleteShader(vertexShader); 并将其保留,但无法辨别程序退出时的行为方式有任何差异。

是否应该删除着色器?

最佳答案

无论是否成功编译,着色器对象都存在。所以是的,即使编译失败,您也应该删除它。

着色器对象实际上存储了您在 glShaderSource 中提供的着色器字符串(您可以使用 glGetShaderSource 检索它们)。因此,虽然它们不是 GPU 对象,但它们并不完全是轻量级的。

but cannot discern any difference in how the program behaves as it exits.

你也不会想到。这与分配一个 char* 字符串然后在程序退出时忘记删除它没有什么不同。您不会注意到曾经泄漏过一次的小内存。

关于c++ - OpenGL3 : Clean-up after failed shader compilation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860422/

相关文章:

c++ - 为每个物体绑定(bind)不同的纹理

c++ - 如何高效绘制单点

c++ - linux上搭建cpptest单元测试框架

C++随机将枚举类型分配给变量

c++ - 无法使用 glDrawArrays 绘制

c++ - 如何在 Visual Studio 2013 中本地使用 SDL

glfw - 为什么我在 GLFW3 - OpenGL 中得到 2 个回调

c++ - 找到大于或等于 x(正整数)z(正整数,可能是 2 的幂)倍数的最小整数

c++ - constexpr 构造具有私有(private)成员的对象

c - glewGetString(GLEW_VERSION) 和 glewIsSupported 之间的区别