GLSL着色器编译,但程序没有链接

时间:2015-12-15 13:09:40

标签: c++ opengl-es glsl glsles

我已经很长时间没有进入 OpenGL 了,从来没有使用过 OpenGLES 。 对于我的项目,我必须使用 OpenGLES glGetString(GL_VERSION)打印的版本是 3.0 ,但是因为我正在做一个教程拼贴很有可能我混合了可以在此版本上运行的代码(这就是着色器代码对#version标记进行评论的原因,但无论如何它都无法解决问题。)

这是顶点着色器的代码:

        const GLchar * vertex_shader_source =
//                "#version 100\n                                                             "
//                "                                                                           "
                " attribute vec2 a_TexCoordinate; /* Per-vertex texture coordinate */       "
                "                                 /* information we will pass in.  */       "
                " attribute vec2 coord2d;                                                   "
                "                                                                           "
                "                                                                           "
                " varying vec2 v_TexCoordinate;   // This will be passed into the fragment  "
                "                                                                           "
                " void main(){                                                              "
                "                                                                           "
                "       gl_Position = vec4(coord2d, 0.0, 1.0);                              "
                "                                                                           "
                "     // Pass through the texture coordinate.                               "
                "        v_TexCoordinate = a_TexCoordinate;                                 "
                " }                                                                         ";

        glShaderSource(vertex_shader_index, 1, &vertex_shader_source, nullptr);
        glCompileShader(vertex_shader_index);
        glGetShaderiv(vertex_shader_index, GL_COMPILE_STATUS, &compile_ok);

这是片段着色器的代码:

        const GLchar * fragment_shader_source =
//                "#version 100\n                                                     "
//                "                                                                   "
                "uniform sampler2D u_Texture;    // The input texture.              "
                "                                                                   "
                "varying vec2 v_TexCoordinate; /* Interpolated texture    */        "
                "                              /* coordinate per fragment */        "
                "                                                                   "
                " void main(){                                                      "
                "                                                                   "
                "     // Output color = color of the texture at the specified UV    "
                "     gl_FragColor = texture2D(u_Texture, v_TexCoordinate);         "
                " }                                                                 ";

        glShaderSource(fragment_shader_index, 1, &fragment_shader_source, nullptr);
        glCompileShader(fragment_shader_index);
        glGetShaderiv(fragment_shader_index, GL_COMPILE_STATUS, &compile_ok);

这是该程序的代码:

m_program = glCreateProgram( );
        glAttachShader(m_program, vertex_shader_index);
        glAttachShader(m_program, fragment_shader_index);
        glLinkProgram(m_program);
        glGetProgramiv(m_program, GL_LINK_STATUS, &link_ok);

变量link_ok false ,而变量compile_ok都是 true 。程序链接的扩展错误说:

(0)顶点信息:C3001没有定义程序 (0)片段信息:C3001没有定义程序

1 个答案:

答案 0 :(得分:4)

您的个人着色器编译得很好。您获得的特定错误代码意味着在完整的程序中找不到主要功能。 并且有充分的理由 - 你评论了他们。您的着色器字符串不包含任何新行,因此整个着色器都在一行上。

例如:

const GLchar * var = "uniform value; // a value"
                     "main () {}               ";

实际上是

const GLchar * var = "uniform value; // a valuemain() {}";

用//注释掉其余部分的任何评论 - 因此你的着色器的其余部分。删除//注释,用/ ** /替换它们或在每行末尾添加\ n,它对我来说很好。

此外,使用\ 0对字符串进行空终止可能是安全的。