我有一个已编译的着色器或程序(不确定正确的术语),我需要将其删除。
如何找到已编译程序和/或着色器的ID?
我知道它存在是因为调试器告诉我我正在尝试重新定义它,并且由于这个原因无法再次编译它:
ERROR: 0:1: error(#198) Redefinition at_coord_Y
ERROR: 1:1: error(#248) Function already has a body main
着色器源的第一行是:
"in float at_coord_Y;"
我可以以某种方式使用它来查找Id吗?
编辑1:希望澄清一下,着色器无法编译,因为它已经存在。
GLint compiled = UNDEFINED_VALUE;
const GLchar* shaderSrc[] = {
"in float at_coord_Y;",
"void main()",
"{",
// Dont mind the empty space
"}"
};
GLuint shaderId = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(shaderId, glNumberOfLines(shaderSrc), shaderSrc, NULL);
glCompileShader(shaderId); // Fail to compile because it already exists. Redefinition error.
glGetShaderiv(shaderId), GL_COMPILE_STATUS, &compiled); // Compile status GL_FALSE
但是如何找到现有着色器(或程序)的ID?
答案 0 :(得分:6)
您完全误解了错误。 OpenGL并不是说着色器对象(你用glCreateShader
得到的)已经定义了。它说您的着色器的文本(使用glShaderSource
传递的内容)存在问题。
着色器加载存在许多问题。我不知道你从哪里获得这个加载代码,但我强烈建议避免那个地方。
glShaderSource
需要多个字符串,是的。但不意味着你将每一行都抛到一个单独的字符串中。它应该用于“标题”之类。这意味着编译器在编译时会将所有字符串连接在一起。
通常,除非您使用额外的字符串作为标头在主着色器上添加前缀,否则只需传递一个一个字符串的数组。救你自己的痛苦。
此外,您没有使用a #version
directive。如果不指定版本,则必须使用GLSL 1.10。在GLSL 1.10中,in float at_coord_Y;
不是法律定义。