在編譯頂點着色器或片段着色器時,是否應該在未能編譯的着色器上調用glDeleteShader()
函數,或只適用於成功編譯的着色器?OpenGL3:在着色器編譯失敗後清理
例如,使用着色器
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-子句由於syntax-錯誤:error: syntax error, unexpected '}', expecting ',' or ';'
。
我曾嘗試在if子句中添加glDeleteShader(vertexShader);
以及將其遺漏,但無法區分程序在退出時的行爲方式。
着色器應該被刪除嗎?