2016-01-18 1 views
2

Lors de la compilation d'un vertex ou fragment-shader, faut-il appeler la fonction glDeleteShader() sur le shader qui n'a pas pu être compilé ou est-elle uniquement applicable aux shaders compilés avec succès?OpenGL3: Nettoyage après une compilation de shader échouée

Par exemple, en utilisant le shader

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 
    "}"; 

qui est cassé à cause d'un point-virgule manquant, en collaboration avec:

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; 
} 

déclenchera l'article si en raison d'un syntax- erreur: error: syntax error, unexpected '}', expecting ',' or ';'.

J'ai essayé d'ajouter glDeleteShader(vertexShader); à l'intérieur de la clause if, mais je ne peux pas discerner de différence dans le comportement du programme lorsqu'il se termine.

Le nuanceur doit-il être supprimé?

Répondre

2

Un objet shader existe, qu'il ait été compilé avec succès ou non. Donc oui, vous devriez le supprimer même si la compilation a échoué.

Les objets Shader possèdent en réalité un espace de stockage pour les chaînes de shaders que vous avez fournies dans glShaderSource (vous pouvez les récupérer avec glGetShaderSource). Donc, bien qu'ils ne soient pas des objets GPU, ils ne sont pas vraiment légers.

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

Vous ne vous attendez pas à. Il ne serait pas différent d'allouer une chaîne char* puis d'oublier de la supprimer au moment où le programme se termine. Vous ne remarquerez pas le petit souvenir que vous avez perdu une fois.

1

De OpenGL Documentations:

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().

Cela signifie que si la compilation réussit ou non, la mémoire restera allouée. Donc, oui, vous devez appeler glDeleteShader