无法将着色器发送到GPU内存

时间:2012-12-24 23:29:30

标签: c++ opengl glsl shader

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

顶点着色器:

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;
}

编辑:

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

编辑2:

Infolog说一切都好。从C ++代码开始,Program的Infolog说它也没关系,但是从glRemedy来看,上面就有这个错误。此外,我无法从glRemedy看到着色器的来源,它们的大小是0kb。不,我设置的测试表明某些东西不起作用。

编辑3:

圣诞快乐! = d

1 个答案:

答案 0 :(得分: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原因,大多数人的着色器加载器不起作用)。