#pragma once #include //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); }