#pragma once
#include <stdio.h>
//GLSLクラス
class GLSL{
public:
GLuint ShaderProg;
GLuint VertexShader, FragmentShader;
void ReadShaderCompile(GLuint Shader, const char *File);//shader
fileを読み込みコンパイルする
void Link( GLuint Prog );//リンクする
void InitGLSL(const char *VertexFile);//GLSLの初期化
void InitGLSL(const char *VertexFile, const char
*FragmentFile);//GLSLの初期化
void ON();//シェーダー描画に切り替え
void OFF();//シェーダー解除
~GLSL();
};
void GLSL::ReadShaderCompile(GLuint Shader, const char *File){
FILE *fp;
char *buf;
GLsizei size, len;
GLint compiled;
fopen_s(&fp,File, "rb");
if(!fp) printf("ファイルを開くことができません %s\n", File);
fseek(fp, 0, SEEK_END);
size = ftell(fp);
buf = (GLchar *)malloc(size);
if (buf == NULL) {
printf("メモリが確保できませんでした \n");
}
fseek(fp, 0, SEEK_SET);
fread(buf, 1, size, fp);
glShaderSource(Shader, 1, (const GLchar **)&buf, &size);
free(buf);
fclose(fp);
glCompileShader(Shader);
glGetShaderiv( Shader, GL_COMPILE_STATUS, &compiled );
if ( compiled == GL_FALSE )
{
printf( "コンパイルできませんでした!!: %s \n ", File);
glGetProgramiv( Shader, GL_INFO_LOG_LENGTH, &size );
if ( size > 0 )
{
buf = (char *)malloc(size);
glGetShaderInfoLog( Shader, size, &len, buf);
printf(buf);
free(buf);
}
}
}
void GLSL::Link( GLuint Prog ){
GLsizei size, len;
GLint linked;
char *infoLog ;
glLinkProgram( Prog );
glGetProgramiv( Prog, GL_LINK_STATUS, &linked );
if ( linked == GL_FALSE ){
printf("リンクできませんでした!! \n");
glGetProgramiv( Prog, GL_INFO_LOG_LENGTH, &size );
if ( size > 0 ){
infoLog = (char *)malloc(size);
glGetProgramInfoLog( Prog, size, &len, infoLog );
printf(infoLog);
free(infoLog);
}
}
}
void GLSL::InitGLSL(const char *VertexFile){
GLenum err = glewInit();
if (err != GLEW_OK)
{
printf("Error: %s\n", glewGetErrorString(err));
}
printf("VENDOR= %s \n", glGetString(GL_VENDOR));
printf("GPU= %s \n", glGetString(GL_RENDERER));
printf("OpenGL= %s \n", glGetString(GL_VERSION));
printf("GLSL= %s \n", glGetString(GL_SHADING_LANGUAGE_VERSION));
VertexShader = glCreateShader(GL_VERTEX_SHADER);
ReadShaderCompile(VertexShader, VertexFile);
ShaderProg = glCreateProgram();
glAttachShader(ShaderProg, VertexShader);
glDeleteShader(VertexShader);
Link(ShaderProg);
}
void GLSL::InitGLSL(const char *VertexFile, const char *FragmentFile){
GLenum err = glewInit();
if (err != GLEW_OK)
{
printf("Error: %s\n", glewGetErrorString(err));
}
printf("VENDOR= %s \n", glGetString(GL_VENDOR));
printf("GPU= %s \n", glGetString(GL_RENDERER));
printf("OpenGL= %s \n", glGetString(GL_VERSION));
printf("GLSL= %s \n", glGetString(GL_SHADING_LANGUAGE_VERSION));
VertexShader = glCreateShader(GL_VERTEX_SHADER);
FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
ReadShaderCompile(VertexShader, VertexFile);
ReadShaderCompile(FragmentShader, FragmentFile);
ShaderProg = glCreateProgram();
glAttachShader(ShaderProg, VertexShader);
glAttachShader(ShaderProg, FragmentShader);
glDeleteShader(VertexShader);
glDeleteShader(FragmentShader);
Link(ShaderProg);
}
void GLSL::ON(){
glUseProgram(ShaderProg);
}
void GLSL::OFF(){
glUseProgram(0);
}
GLSL::~GLSL(){
glDeleteProgram(ShaderProg);
}
|