0

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

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

4

1 回答 1

7

你完全误解了这个错误。OpenGL 并不是说​​已经定义了着色器对象(你得到的)。glCreateShader这是说你的着色器文本(你传递的内容glShaderSource)有问题。

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

glShaderSource需要多个字符串,是的。但这并不意味着您将每一行都放入一个单独的字符串中。它应该用于“标题”等。这意味着编译器将在编译它们时将所有字符串连接在一起。

一般来说,除非您使用额外的字符串作为标题作为主着色器的前缀,否则只需传递一个字符串的数组。拯救自己的痛苦。

另外,您没有使用#version指令。如果不指定版本,您将被迫使用 GLSL 1.10。而在 GLSL 1.10 中,in float at_coord_Y;这不是一个法律定义。

于 2012-10-19T07:01:53.550 回答