我有一个编译着色器或程序(不确定正确的术语),我需要删除它.
如何找到已编译程序和/或着色器的ID?
我知道它存在是因为调试器告诉我我正在尝试重新定义它,并且因为这个而无法再次编译它:
ERROR: 0:1: error(#198) Redefinition at_coord_Y
ERROR: 1:1: error(#248) Function already has a body main
Run Code Online (Sandbox Code Playgroud)
着色器源的第一行是:
"in float at_coord_Y;"
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式使用它来找到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
Run Code Online (Sandbox Code Playgroud)
但是如何找到现有着色器(或程序)的Id?
你完全误解了这个错误.OpenGL并不是说已经定义了着色器对象(你得到的东西glCreateShader
).它说你的着色器文本中存在问题(你传递的是什么glShaderSource
).
着色器加载存在许多问题.我不知道你从哪里获得这个加载代码,但我强烈建议避免那个地方.
glShaderSource
需要多个字符串,是的.但这并不意味着你将每一行都扔进一个单独的字符串中.它应该用于"标题"之类.这意味着,编译器将串联编译时他们所有的串在一起.
通常,除非您使用额外的字符串作为标头在主着色器上添加前缀,否则只需传递一个字符串的数组.救你自己的痛苦.
此外,您没有使用一个#version
指令.如果不指定版本,则必须使用GLSL 1.10.在GLSL 1.10中,in float at_coord_Y;
不是法律定义.