删除现有着色器或程序(或获取其ID以执行此操作)

0 opengl shader

我有一个编译着色器或程序(不确定正确的术语),我需要删除它.

如何找到已编译程序和/或着色器的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?

Nic*_*las 6

你完全误解了这个错误.OpenGL并不是说已经定义了着色器对象(你得到的东西glCreateShader).它说你的着色器文本中存在问题(你传递的是什么glShaderSource).

着色器加载存在许多问题.我不知道你从哪里获得这个加载代码,但我强烈建议避免那个地方.

glShaderSource需要多个字符串,是的.但这并不意味着你将每一行都扔进一个单独的字符串中.它应该用于"标题"之类.这意味着,编译器将串联编译时他们所有的串在一起.

通常,除非您使用额外的字符串作为标头在主着色器上添加​​前缀,否则只需传递一个字符串的数组.救你自己的痛苦.

此外,您没有使用一个#version指令.如果不指定版本,则必须使用GLSL 1.10.在GLSL 1.10中,in float at_coord_Y;不是法律定义.