我正在尝试将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答案 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原因,大多数人的着色器加载器不起作用)。