1

我正在尝试将 glsl 程序与之前已成功编译的 2 个着色器链接,但该程序不会链接。根据 glRemedy 的调试器,错误信息是ERROR: Definition for "void main()" not found. 经过一些调试,我发现 GPU 没有收到任何着色器,再次根据 glRemedy。我相信,我的代码看起来正确并且从客户端按预期执行。

顶点着色器:

layout(location = 0) in vec3 vertexPosicao;

void main() {
    gl_Position.xyz = vertexPosicao;
    gl_Position.w = 1.0;
}

片段着色器:

out vec3 cor;

void main() {
    cor = vec3(1, 0, 0);
}

加载代码:

bool Shader::fromCode(std::string strCode) {
    GLint result;
    GLchar *code = new GLchar[strCode.size() + 1];
    strcpy(code, strCode.c_str());

    glShaderSource(m_id, 1, const_cast<const GLchar **>(&code), NULL);
    glCompileShader(m_id);
    glGetShaderiv(m_id, GL_COMPILE_STATUS, &result);
    return (bool)result;
}

编辑:

glShaderSource我使用的着色器 ID 上使用后,我得到了源代码。所有的。但它似乎缺少\n。那会是个问题吗?

编辑2:

Infolog 说一切正常。从 C++ 代码来看,程序的信息日志也说没问题,但是从 glRemedy 来看,上面有那个错误。另外,我看不到 glRemedy 着色器的来源,它们的大小为 0kb。不,我设置的测试显示某些东西不起作用。

编辑 3:

圣诞节快乐!=D

4

1 回答 1

1

为什么这么复杂,复制到一个新分配的 GLchar* 我的意思是(你忘记删除 [] 之后)。我会将其重写为

bool Shader::fromCode(std::string strCode) {
    GLint result;
    GLuint source_length = strCode.length();
    GLchar const * strCodePtr = strCode.c_str();

    glShaderSource(m_id, 1, &strCodePtr, &source_length);
    glCompileShader(m_id);
    glGetShaderiv(m_id, GL_COMPILE_STATUS, &result);
    return (bool)result;
}

附加的 source_length 参数负责处理之后可能在内存中找到的任何尾随垃圾(第 1 个原因,大多数人的着色器加载器不起作用)。

于 2012-12-25T00:14:50.330 回答