首页 > 解决方案 > 将着色器附加到程序时出现 OpenGL 错误 #1281

问题描述

将已编译的着色器附加到我的程序时,出现 OpenGL 错误 #1281。这是顶点着色器代码:

#version 330 core

layout(location = 0) in vec2 position;

void main(){
  gl_Position = vec4(position, 0.0f, 0.0f);
}

这是片段着色器代码:

#version 330 core

out vec4 color;

void main(){
  color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}

这是创建着色器(程序)的方法:

Shader::Shader(std::string vsfilename, std::string fsfilename)
  :program(glCreateProgram()) {
  const char* vscode = fileToString(vsfilename.c_str());
  const char* fscode = fileToString(fsfilename.c_str());

  unsigned int vs, fs;

  //Compiling Vertex shader
  vs = glCreateShader(GL_VERTEX_SHADER);
  glShaderSource(vs, 1, &vscode, NULL);
  glCompileShader(vs);

  int result;
  glGetShaderiv(vs, GL_COMPILE_STATUS, &result);
  if(!result){
    glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &result);

    char* infolog = (char*) malloc(result*sizeof(char));
    glGetShaderInfoLog(vs, result, &result, infolog);

    std::cout<<"Problem with vs compilation"<<std::endl;
    std::cout<<infolog<<std::endl;

    free((void*)infolog);
    glDeleteShader(vs);
    vs = 0;
  }

  fs = glCreateShader(GL_FRAGMENT_SHADER);
  glShaderSource(fs, 1, &fscode, NULL);
  glCompileShader(fs);

  glGetShaderiv(fs, GL_COMPILE_STATUS, &result);
  if(!result){
    glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &result);

    char* infolog = (char*) malloc(result*sizeof(char));
    glGetShaderInfoLog(fs, result, &result, infolog);

    std::cout<<"Problem with fs compilation"<<std::endl;
    std::cout<<infolog<<std::endl;

    free((void*)infolog);
    glDeleteShader(fs);
    fs = 0;
  }

  glAttachShader(vs, program);
  int error;
  do{
    error = glGetError(); //error 1281
    std::cout<<error<<std::endl;
  } while(error != 0);
  glAttachShader(fs, program);

  glLinkProgram(program);
  glValidateProgram(program);

  glDetachShader(vs, program);
  glDetachShader(fs, program);
  glDeleteShader(vs);
  glDeleteShader(fs);
  free((void*)vscode);
  free((void*)fscode);
}

标签: c++copenglshaderglew

解决方案


错误 1281 表示 INVALID_VALUE,如果程序或着色器不是由 OpenGL 生成的值,则会生成错误。

的第一个参数glAttachShader是程序,第二个参数是着色器:

glAttachShader(vs, program);

glAttachShader(program, vs);

推荐阅读