【问题标题】:GLSL link errorGLSL 链接错误
【发布时间】:2013-10-28 06:27:24
【问题描述】:

我目前正对尝试编译 GLSL 着色器时遇到的错误感到沮丧,我已经成功地编译了这两个着色器,但是在链接它们时出现错误。没有输出,但链接失败。

这里是编译+链接代码:

GLuint program = NULL;
GLint compile_ok = GL_FALSE, link_ok = GL_FALSE;

GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertCont, NULL);
glCompileShader(vs);
glGetShaderiv(vs, GL_COMPILE_STATUS, &compile_ok);
char logBuf[1024];
int len;
if (0 == compile_ok)
{
    glGetShaderInfoLog(vs, sizeof(logBuf), &len, logBuf);
    LogMgr::logMessage(LogMgr::CRITICAL, "Error in vertex shader\n", logBuf);
    return false;
}

GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragCont, NULL);
glCompileShader(fs);
glGetShaderiv(fs, GL_COMPILE_STATUS, &compile_ok);
if (!compile_ok) 
{
    glGetShaderInfoLog(vs, sizeof(logBuf), &len, logBuf);
    LogMgr::logMessage(LogMgr::CRITICAL, "Error in fragment shader", logBuf);
    return false;
}

glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
if (!link_ok) 
{
    glGetShaderInfoLog(vs, sizeof(logBuf), &len, logBuf);
    LogMgr::logMessage(LogMgr::CRITICAL, "Could not link basic shaders!", logBuf);
    return false;
}
return program;

这是顶点着色器:

#version 330

layout(location = 0) in vec4 position;
void main()
{
    gl_Position = position;
}

片段着色器:

#version 330

out vec4 outputColor;
void main()
{
   outputColor = vec4(1.0f, 0.0f, 1.0f, 1.0f);
}

有什么线索吗?

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:

    您对 getShaderInfoLog 的调用是错误的。您总是在检查顶点着色器的编译日志。这解释了为什么您没有看到任何错误消息。这就是复制和粘贴代码所得到的;)

    对于片段着色器,应该是:

    glGetShaderInfoLog(fs, sizeof(logBuf), &len, logBuf);
    

    对于链接状态:

    glGetProgramInfoLog(program, sizeof(logBuf), &len, logBuf);
    

    【讨论】:

    • 谢谢!我现在试试,我忘了改那个东西xD
    • 好的,在我改变它之后,这是我得到的链接器错误:[|[|[|[|[|[|[|[|[|[|[|[|[| [|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[| [|[|[|[|[|[|[|[|[|[|[|[|[|[|[|现在看起来不太好:S 编辑:这是一个显示真实错误文本的图片链接(我无法以与写入相同的方式复制它)dl.dropbox.com/u/38127392/Untitled.png
    • 您能否将问题中的代码更新为您现在拥有的代码?
    • 看起来您没有将长度 lenglGetProgramInfoLog 返回到 LogMgr::logMessage,因此您可能打印的是随机垃圾而不是实际错误...跨度>
    • 不,当我早些时候在着色器上遇到编译错误时,它输出了正确的信息。
    【解决方案2】:

    问题是我没有创建程序对象。我在链接之前添加了这行代码,它起作用了:

    program = glCreateProgram();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多