我们可以删除顶点和片段着色器链接着色器程序

问题描述:

后如题所说,我能做到这一点在我的计划:我们可以删除顶点和片段着色器链接着色器程序

vertex = glCreateShader(GL_VERTEX_SHADER); 
/* ... */ 
fragment = glCreateShader(GL_FRAGMENT_SHADER); 
/* ... */ 
program = glCreateProgram(); 
glAttachShader(program, vertex); 
glAttachShader(program, fragment); 
glLinkProgram(program); 
/* All things done */ 

glDeleteShader(vertex); /* <~ Can I do this now? */ 
glDeleteShader(vertex); /* <~ Can I do this now? */ 

/* And in render procedure */ 
glUseProgram(program); /* <~ Still use program without any problem? */ 
/* ... */ 
+1

[正确的方法来删除GLSL着色器?](http://*.com/questions/9113154/proper-way-to-delete-glsl-shader) – 2013-02-10 19:06:22

是,这一完全合法的。着色器对象仍然由程序对象在内部引用,并且在程序对象被删除时将被隐式释放。

+0

请再问一个问题:D。如果我们在链接程序之后不删除着色器,我们是否需要稍后删除着色器(也许在删除程序时......)? – 2013-02-12 01:57:13

+0

@BìnhNguyên:不可以。您也可以将单个着色器对象链接到多个程序。例如,您可以重复使用与几个不同片段着色器相同的顶点着色器(这些必须与顶点着色器的变化输出匹配)。如果你丢失了一个OpenGL对象的句柄,你不能再使用它,但是当OpenGL上下文被删除时,所有东西都会被隐式释放。 – datenwolf 2013-02-12 10:44:19