gpt4 book ai didi

c++ - GLSL 着色器正在编译,但程序未链接

转载 作者:行者123 更新时间:2023-11-27 22:54:49 25 4
gpt4 key购买 nike

我已经很长时间没有接触过 OpenGL,也从未使用过 OpenGLES。对于我的项目,我必须使用 OpenGLESglGetString(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_okfalse,而变量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 终止字符串可能是安全的。

关于c++ - GLSL 着色器正在编译,但程序未链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com