C++ Can';t将着色器发送到GPU内存
我正在尝试将一个glsl程序与之前已成功编译的两个着色器链接,但该程序无法链接。根据glRemedy的调试器,错误消息是C++ Can';t将着色器发送到GPU内存,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我正在尝试将一个glsl程序与之前已成功编译的两个着色器链接,但该程序无法链接。根据glRemedy的调试器,错误消息是error:notfound“void main()”的定义。经过一些调试,我发现 根据glRemedy的说法,GPU没有收到任何着色器。我的代码看起来不错 我相信,客户方面的表现与预期一致 顶点着色器: layout(location = 0) in vec3 vertexPosicao; void main() { gl_Position.xyz = vertex
error:notfound“void main()”的定义
。经过一些调试,我发现
根据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;
}
bool着色器::fromCode(std::string strCode){
闪烁结果;
GLchar*code=新GLchar[strCode.size()+1];
strcpy(代码,strCode.c_str());
glShaderSource(m_id,1,const_cast(&code),NULL);
glCompileShader(m_id);
glGetShaderiv(m_id、GL_编译状态和结果);
返回(bool)结果;
}
编辑:
在我使用的着色器ID上使用glShaderSource
后,我获得了源代码。所有这些。但它似乎丢失了\n的。那会是个问题吗
编辑2:
信息日志说一切都很好。从C++代码中,程序的内部文件也表明它是可以的,但是从GLPoice中,上面有错误。另外,我看不到glRemedy中着色器的来源,它们的大小是0kb。不,我设置的测试显示有些东西不起作用
编辑3:
圣诞快乐=D为什么这么复杂,复制到新分配的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参数负责处理以后可能在内存中找到的任何尾随垃圾(第一个原因,大多数人的着色器加载程序不工作)。为什么这么复杂,复制到新分配的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参数负责处理以后可能在内存中找到的任何尾随垃圾(第一个原因,大多数人的着色器加载程序不工作)。我仍然无法发送着色器。@winglead:我刚刚注意到了什么?在哪里分配着色器ID?必须在某处调用glCreateShader才能获得
m\u id
。如果在构造函数中发生这种情况(即Shader::Shader),那么调用构造函数时可能没有有效的OpenGL上下文。在调用glShaderSource之前创建着色器ID可以避免此问题。glishader
告诉我它是一个有效的着色器ID。@BenVoigtglShaderSource(m_ID,1,const_cast(&code),&size)代码>@wingleader:我非常讨厌const_cast
。当你获得经验时,你也会。只要把code
做成正确的类型,你就不需要它了。在datenwolf的回答中,strCodePtr
需要是const
,因为从c_str()
返回的是。我仍然无法发送着色器。@wingleader:我刚刚注意到了什么?在哪里分配着色器ID?必须在某处调用glCreateShader才能获得m\u id
。如果在构造函数中发生这种情况(即Shader::Shader),那么调用构造函数时可能没有有效的OpenGL上下文。在调用glShaderSource之前创建着色器ID可以避免此问题。glishader
告诉我它是一个有效的着色器ID。@BenVoigtglShaderSource(m_ID,1,const_cast(&code),&size)代码>@wingleader:我非常讨厌const_cast
。当你获得经验时,你也会。只要把code
做成正确的类型,你就不需要它了。在datenwolf的回答中,strCodePtr
需要是const
,因为c_str()
的返回是。缺少换行符不是问题。GLSL将它们视为空白,可以在不影响解析过程的情况下大大减少空白。是否尝试使用glGetShaderInfoLog
读取着色器信息日志?缺少换行符不是问题。GLSL将它们视为空白,可以在不影响解析过程的情况下大大减少空白。您是否尝试过使用glGetShaderInfoLog
读取着色器信息日志?