C++ Can';t将着色器发送到GPU内存

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

我正在尝试将一个glsl程序与之前已成功编译的两个着色器链接,但该程序无法链接。根据glRemedy的调试器,错误消息是
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。@BenVoigt
glShaderSource(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。@BenVoigt
glShaderSource(m_ID,1,const_cast(&code),&size)@wingleader:我非常讨厌
const_cast
。当你获得经验时,你也会。只要把
code
做成正确的类型,你就不需要它了。在datenwolf的回答中,
strCodePtr
需要是
const
,因为
c_str()
的返回是。缺少换行符不是问题。GLSL将它们视为空白,可以在不影响解析过程的情况下大大减少空白。是否尝试使用
glGetShaderInfoLog
读取着色器信息日志?缺少换行符不是问题。GLSL将它们视为空白,可以在不影响解析过程的情况下大大减少空白。您是否尝试过使用
glGetShaderInfoLog
读取着色器信息日志?