bambooflow Note

ロードシェーダ

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

ロードシェーダ


  • OpenGL3.x (>=2.x)
  • GL3W or GLEW 1.5.7

シェーダを読み込む関数をまとめました。
ソースコードを記述します。



ソースコード


  • load_shader.h
#ifndef __LOAD_SHADER_H_
#define __LOAD_SHADER_H_
 
#include <GL/gl.h>
#include <list>
 
GLuint loadShaderFromFile(GLenum type, const char *fileName);
GLuint loadShader(GLenum type, const char *str, const char* fileName="");
GLuint createProgram(const std::list<GLuint>& shaderList);
 
#endif // __LOAD_SHADER_H_
 
 


  • load_shader.cpp
//#include <GL/glew.h>
#include <GL3/gl3w.h>
#include "load_shader.h"
 
#include <iostream>
#include <fstream>
#include <list>
 
 
GLuint loadShaderFromFile(GLenum type, const char *fileName)
{
  std::fstream inputFile(fileName);
  std::istreambuf_iterator<char> dataBegin(inputFile);
  std::istreambuf_iterator<char> dataEnd;
  std::string fileData(dataBegin, dataEnd);
  const char *str = fileData.c_str();
 
  return loadShader(type, str, fileName);
}
 
GLuint loadShader(GLenum type, const char *str, const char *fileName)
{
  GLuint shader;
  GLint compiled;
 
  shader = glCreateShader(type);
  if (shader == 0)
    return 0;
 
  glShaderSource(shader, 1, &str, NULL);
  glCompileShader(shader);
  glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
  if (!compiled) {
    GLint infoLen = 0;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
    if (infoLen > 1 ) { 
      char* infoLog = new char[sizeof(char)*infoLen];
      glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
      std::cerr << "Error compiling shader: " << fileName << "\n" << infoLog << "\n";
      delete [] infoLog;
    }   
    glDeleteShader(shader);
    return 0;
  }
  return shader;
}
 
GLuint createProgram(const std::list<GLuint>& shaderList)
{
  GLuint program;
  GLint linked;
 
  program = glCreateProgram();
 
  std::vector<GLuint>::const_iterator it = shaderList.begin();
  while (it != shaderList.end()) {
    glAttachShader(program, (*it));
    ++it;
  }
 
  glLinkProgram(program);
 
  glGetProgramiv(program, GL_LINK_STATUS, &linked);
  if (linked == GL_FALSE) {
    GLint infoLen = 0;
 
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
    if (infoLen > 1) {
      char *infoLog = new char[sizeof(char)*infoLen];
 
      glGetProgramInfoLog(program, infoLen, NULL, infoLog);
      std::cerr << "Error linking program:\n" << infoLog << "\n";
      delete [] infoLog;
    }   
    glDeleteProgram(program);
    return 0;
  }
 
  return program;
}
 


使い方


#include "load_shader.h"
 
GLuint theProgram;
 
void initGLSL()
{
  std::list<GLuint> shader;
  shader.push_back( loadShaderFromFile(GL_VERTEX_SHADER, "simple.vert") );
  shader.push_back( loadShaderFromFile(GL_GEOMETRY_SHADER, "simple.geom") );
  shader.push_back( loadShaderFromFile(GL_FRAGMENT_SHADER, "simple.frag") );
  theProgram = createProgram( shader );
}
 
 

タグ:

OpenGL GLSL
記事メニュー
ウィキ募集バナー