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

时间:2012-10-19 05:57:20

标签: opengl shader

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

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

1 个答案:

答案 0 :(得分:6)

您完全误解了错误。 OpenGL并不是说着色器对象(你用glCreateShader得到的)已经定义了。它说您的着色器的文本(使用glShaderSource传递的内容)存在问题。

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

glShaderSource需要多个字符串,是的。但意味着你将每一行都抛到一个单独的字符串中。它应该用于“标题”之类。这意味着编译器在编译时会将所有字符串连接在一起

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

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