C++ 着色器附件错误。无效程序或着色器

C++ 着色器附件错误。无效程序或着色器,c++,oop,opengl,glsl,C++,Oop,Opengl,Glsl,我在写我的图形程序。我试图将着色器中的特征抽象到一个类中。我测试了常规绘图代码,它可以正常工作。着色器也可以运行,但一旦我开始使用这些OpenGL着色器函数,它就会停止工作 Shader::Shader(char c) { //program = int(0); if (program!=0 || glIsProgram(program)) glDeleteProgram(program); uniforms.clear(); program =

我在写我的图形程序。我试图将着色器中的特征抽象到一个类中。我测试了常规绘图代码,它可以正常工作。着色器也可以运行,但一旦我开始使用这些OpenGL着色器函数,它就会停止工作

Shader::Shader(char c)
{
    //program = int(0);
    if (program!=0 || glIsProgram(program))
        glDeleteProgram(program);
    uniforms.clear();

    program = glCreateProgram();
}

void Shader::compileProgram()
{
    GLint Result = GL_FALSE;
    int InfoLogLength;

    glLinkProgram(program);

    glValidateProgram( program);

    glGetProgramiv(program, GL_LINK_STATUS, &Result);
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::string ProgramErrorMessage = std::string();
    ProgramErrorMessage.resize( glm::max(InfoLogLength, int(1)));
    glGetProgramInfoLog(program, InfoLogLength, NULL, &ProgramErrorMessage[0]);
    std::cout << ProgramErrorMessage.c_str() << std::endl;
}

void Shader::addToProgram( std::string File, GLenum type)
{
    std::cout << glGetError() << std::endl;

    GLuint shader = glCreateShader(type);

    std::cout << glewGetErrorString(glGetError()) << std::endl;

    std::string ShaderCode;
    std::ifstream ShaderStream(File, std::ios::in);
    if(ShaderStream.is_open())
    {
        std::string Line = "";
        while(getline(ShaderStream, Line))
            ShaderCode += Line + "\n";
        ShaderStream.close();
    }

    GLint Result = GL_FALSE;
    int InfoLogLength;

    // Compile Vertex Shader
    std::cout << "Compiling shader : " <<  File<< std::endl;
    const char * SourcePointer = ShaderCode.c_str();
    std::cout << SourcePointer << std::endl;
    int length = ShaderCode.size();
    glShaderSource(shader, 1, &SourcePointer , &length );

    glCompileShader(shader);

    // Check Vertex Shader
    glGetShaderiv(shader, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> ShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(shader, InfoLogLength, NULL, &ShaderErrorMessage[0]);
    printf("%s\n", &ShaderErrorMessage[0]);

    glAttachShader(program, shader);  //Invalid Operation, eighter Program or shader invalid

    std::cout << glGetError() << std::endl;
Shader::Shader(char c)
{
//程序=int(0);
if(program!=0 | | glIsProgram(program))
glDeleteProgram(program);
制服;
program=glCreateProgram();
}
void着色器::compileProgram()
{
闪烁结果=GLU FALSE;
int信息长度;
glLinkProgram(program);
GLP程序(程序);
glGetProgramiv(程序、GL链接状态和结果);
glGetProgramiv(程序、总账信息、日志长度和信息日志长度);
std::string ProgramErrorMessage=std::string();
resize(glm::max(InfoLogLength,int(1));
glGetProgramInfoLog(程序、InfoLogLength、NULL和ProgramErrorMessage[0]);

所以问题是程序无效

我所做的是:

if(!glIsProgram(program))
    program = glCreateProgram();

glAttachShaders(program, shader);

我在构造函数中也做了同样的保护。我仍然想知道这是怎么发生的。我的意思是我在Debug中检查了值,它们似乎都是有效的。

您是否收到编译器错误?您询问着色器是否正确编译,但您没有在某处使用“结果”。问题是我没有得到任何信息输出。但结果是0(GL_FALSE)。我实际上解决了这个问题,因为某种原因程序是无效的