2016-01-18 4 views
2

При компиляции вершинного или фрагментарного шейдера следует вызвать функцию 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; 
} 

вызовет предложение, если-из-за syntax- ошибка: error: syntax error, unexpected '}', expecting ',' or ';'.

Я попытался добавить glDeleteShader(vertexShader); внутри if-предложения так же, как и оставить его, но не может различить разницу в том, как работает программа при ее выходе.

Должен ли быть удален шейдер?

ответ

2

Шейдерный объект существует, был ли он скомпилирован или нет. Так что да, вы должны удалить его, даже если это не удалось компиляции.

Шейдерные объекты имеют хранилища для шейдерных строк, которые вы указали в glShaderSource (вы можете получить их с помощью glGetShaderSource). Поэтому, хотя они не являются объектами GPU, они не совсем легкие.

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

И вы не ожидали. Это ничем не отличается от выделения строки char*, а затем забывает удалить ее к моменту выхода программы. Вы не заметите маленькую память, которую вы пропустили один раз.

1

С 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

Смежные вопросы