GLSL 着色器正在编译,但程序未链接
GLSL shaders compiling, but program not linking
我已经很长时间没有使用 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 未定义程序
您的个人着色器编译得很好。您得到的具体错误代码是指在完整的程序中找不到主要功能。
并且有充分的理由 - 你评论了他们。您的着色器字符串不包含任何新行,因此整个着色器在一行上。
例如:
const GLchar * var = "uniform value; // a value"
"main () {} ";
实际上是
const GLchar * var = "uniform value; // a valuemain() {}";
使用// 完成的任何注释都注释掉了该行的其余部分 - 因此您的着色器的其余部分。删除 // 注释,将它们替换为 /**/ 或在每行末尾添加 \n 对我来说效果很好。
此外,用 \0 以 null 结尾的字符串可能是安全的。
我已经很长时间没有使用 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 未定义程序
您的个人着色器编译得很好。您得到的具体错误代码是指在完整的程序中找不到主要功能。 并且有充分的理由 - 你评论了他们。您的着色器字符串不包含任何新行,因此整个着色器在一行上。
例如:
const GLchar * var = "uniform value; // a value"
"main () {} ";
实际上是
const GLchar * var = "uniform value; // a valuemain() {}";
使用// 完成的任何注释都注释掉了该行的其余部分 - 因此您的着色器的其余部分。删除 // 注释,将它们替换为 /**/ 或在每行末尾添加 \n 对我来说效果很好。
此外,用 \0 以 null 结尾的字符串可能是安全的。