ロードシェーダ
- 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 );
}