OpenGL3:着色器编译失败后的清理
OpenGL3: Clean-up after failed shader compilation
在编译顶点着色器或片段着色器时,应该在编译失败的着色器上调用 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 子句:error: syntax error, unexpected '}', expecting ',' or ';'
。
我尝试在 if 子句中添加 glDeleteShader(vertexShader);
以及将其省略,但无法辨别程序退出时的行为方式有何不同。
是否应该删除着色器?
来自 OpenGL 文档:
glDeleteShader frees the memory and invalidates the name associated with the shader object specified by shader. This command effectively undoes the effects of a call to glCreateShader().
这意味着无论编译成功与否,内存都将保持分配状态。所以,是的,你需要调用 glDeleteShader
无论编译成功与否,着色器对象都存在。所以是的,即使编译失败你也应该删除它。
着色器对象实际上存储了您在 glShaderSource
中提供的着色器字符串(您可以使用 glGetShaderSource
检索它们)。因此,虽然它们不是 GPU 对象,但它们并不完全是轻量级的。
but cannot discern any difference in how the program behaves as it exits.
你也不希望。这与分配 char*
字符串然后在程序退出时忘记删除它没有什么不同。你不会注意到你泄露了一次的小内存。
在编译顶点着色器或片段着色器时,应该在编译失败的着色器上调用 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 子句:error: syntax error, unexpected '}', expecting ',' or ';'
。
我尝试在 if 子句中添加 glDeleteShader(vertexShader);
以及将其省略,但无法辨别程序退出时的行为方式有何不同。
是否应该删除着色器?
来自 OpenGL 文档:
glDeleteShader frees the memory and invalidates the name associated with the shader object specified by shader. This command effectively undoes the effects of a call to glCreateShader().
这意味着无论编译成功与否,内存都将保持分配状态。所以,是的,你需要调用 glDeleteShader
无论编译成功与否,着色器对象都存在。所以是的,即使编译失败你也应该删除它。
着色器对象实际上存储了您在 glShaderSource
中提供的着色器字符串(您可以使用 glGetShaderSource
检索它们)。因此,虽然它们不是 GPU 对象,但它们并不完全是轻量级的。
but cannot discern any difference in how the program behaves as it exits.
你也不希望。这与分配 char*
字符串然后在程序退出时忘记删除它没有什么不同。你不会注意到你泄露了一次的小内存。