Beispiel #1
0
void createProgram(GLuint progID, std::vector<const char*> layoutLocations)
{
    for(int i = 0; i < layoutLocations.size(); i++)
    {
        if (layoutLocations[i] != "")
            glBindAttribLocation(progID, i, layoutLocations[i]);
    }
    try
    {
        glLinkProgram(progID);
        GLint compileResult = 0;
        int compileLogLength = 0;

            glGetShaderiv(progID, GL_LINK_STATUS, &compileResult);
            glGetShaderiv(progID, GL_INFO_LOG_LENGTH, &compileLogLength);
            std::vector<char> compileLog(compileLogLength);
            glGetShaderInfoLog(progID, compileLogLength, NULL, &compileLog[0]);
            if (compileLog.size() > 1)
                Logger() << compileLog.data() <<std::endl;

            std::vector<char>().swap(compileLog);
    }
    catch (std::bad_alloc bad)
    {
        std::cerr<<"Bad allocation from compileLog."<<std::endl;
    }

}
Beispiel #2
0
void loadShaderPart(GLuint partID, char * path)
{
    std::string shaderCode;
    std::ifstream stream(path, std::ios::in);
    if(stream.is_open())
    {
        std::string line;
        while(std::getline(stream, line))
            shaderCode += "\n" + line; //HERERERERE is an error
        stream.close();
    }

    GLint compileResult = GL_FALSE;
    int compileLogLength;

    const char * codePointer = shaderCode.c_str();
    glShaderSource(partID, 1, &codePointer, NULL);
    glCompileShader(partID);

    glGetShaderiv(partID, GL_COMPILE_STATUS, &compileResult);
    glGetShaderiv(partID, GL_INFO_LOG_LENGTH, &compileLogLength);
    std::vector<char> compileLog(compileLogLength);
    glGetShaderInfoLog(partID, compileLogLength, NULL, &compileLog[0]);
    if (compileLog.size() > 1)
        Logger() << compileLog.data() << std::endl;

    std::vector<char>().swap(compileLog);
}
Beispiel #3
0
void ShaderErrorHandler(GLuint shader_id) {
  GLint log_size;
  glGetShaderiv(shader_id, GL_INFO_LOG_LENGTH, &log_size);
  log_size = log_size > 0 ? log_size : 1024;
  std::vector<char> compileLog(log_size);
  glGetShaderInfoLog(shader_id, log_size, nullptr, compileLog.data());
  std::cerr << "Compile Error: " << shader_id << " " << compileLog.data()
            << std::endl;
}
void Program::create(VShader& vs, FShader& fs) {
  auto program = glCreateProgram();

  // attach both shaders
  glAttachShader(program, vs.getHandle());
  glAttachShader(program, fs.getHandle());

  // link program
  glLinkProgram(program);

  // check for errors
  GLint linkStatus;
  glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
  if(linkStatus != GL_TRUE) {
    // obtain error message
    GLint logLength;
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
    vector<char> compileLog(logLength);
    glGetShaderInfoLog(program, logLength, nullptr, compileLog.data());
    logError("[Program] Could not link shaders <", vs.getFilename(),
             ", ", fs.getFilename(), "> ->");
    logError("[Program] ", compileLog.data());
    throw GLException("Could not link shaders");
  }
  log("[Program] Shaders <", vs.getFilename(), ", ", fs.getFilename(),
      "> were successfully linked.");

  // detach shaders (TODO: is this a good idea?)
  glDetachShader(program, vs.getHandle());
  glDetachShader(program, fs.getHandle());

  // check for any error
  checkGLError("[Program] GL error while linking program <", GLERR, ">!");

  // linking was successful: commit changes
  m_handle = program;
}