2015-12-15 57 views
0

我一直没有进入OpenGL很长一段时间,从来没有用过OpenGLES。 对于我的项目我必须使用OpenGLES,由glGetString(GL_VERSION)打印的版本是3.0,但因为我正在做一个教程拼贴是完全可能的,我混合代码不能在这个版本(即这就是为什么#version标签在着色器代码上发表评论的原因,但它并没有解决问题)。GLSL着色器编译,但程序没有链接

这是顶点着色器的代码:

 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为假,而变量compile_ok均为为真。从程序的链接扩展的错误说:

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

回答

4

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

例如:

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

实际上就是

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

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

此外,它可能是安全的null结束你的字符串\ 0。

+0

好的,也许这可以解决!现在由于“未定义的浮点变量精度”行125,片段不编译,但着色器短于125行......你能解释哪个浮点是指的错误? – nyarlathotep108

+2

@ nyarlathotep108如果您使用OpenGL ES,则必须指定浮点精度。在片段着色器的顶部添加像这样的'precision mediump float;'。看看这个:http://stackoverflow.com/questions/13780609/what-does-precision-mediump-float-mean – Reigertje