C++ GLSL链路错误

C++ GLSL链路错误,c++,opengl,glsl,C++,Opengl,Glsl,我目前正在为编译GLSL着色器时遇到的错误感到沮丧,我已经成功地编译了这两个着色器,但在链接它们时,我遇到了一个错误。没有输出,但链接失败 以下是编译+链接代码: GLuint program = NULL; GLint compile_ok = GL_FALSE, link_ok = GL_FALSE; GLuint vs = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vs, 1, &vertCont, NULL); glCom

我目前正在为编译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);
}

有什么线索吗?

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

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

glGetShaderInfoLog(fs, sizeof(logBuf), &len, logBuf);
对于链接状态:

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

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

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

glGetShaderInfoLog(fs, sizeof(logBuf), &len, logBuf);
对于链接状态:

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

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

program = glCreateProgram();

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

program = glCreateProgram();

谢谢现在我会试试那个,现在我会试那个,我忘了换那个东西了,我改了之后,我忘了换那个东西了,我改了它之后,这是我得到的作为链接器错误的链接器错误的结果,这是我得到的这是我得到的作为链接器错误的结果,这是我得到的结果,我现在现在我现在现在我现在我忘了现在,我忘了我忘了换那个东西了,我忘了我忘了改变了那个东西了,我改了我改了,我改了之后,我改了,我改了之后,我改了,我改了,这是我改了,这是这是这是我得到的这是我得到的这是我得到的这是我作为链接器错误的作为链接器错误的我得到的我得到的结果,作为链接器错误的链接器错误的我得到的结果,我得到的链接器错误的结果::::::33 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3(我不能用写它的方式复制它)您可以将问题中的代码更新为您现在拥有的代码吗?看起来您没有传递长度
len
您从
glGetProgramInfoLog
返回到
LogMgr::logMessage
,因此您可能正在打印随机垃圾,而不是实际的错误…不,当我之前在着色器上遇到编译错误时,它输出了我输入了正确的信息。谢谢!我现在就尝试一下,我忘记更改那个东西了xDOk在我更改它之后,这是我得到的链接器错误:[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|[|现在看起来不太好:S EDIT:这里有一个链接,指向一张显示真实错误文本的图片(我无法以编写错误文本的方式复制它)您可以将问题中的代码更新为您现在拥有的代码吗?看起来您没有传递长度
len
您从
glGetProgramInfoLog
返回到
LogMgr::logMessage
,因此您可能正在打印随机垃圾,而不是实际的错误…不,当我之前在着色器上遇到编译错误时,它输出了请输入正确的信息。