#include "Shaders.h" #ifdef _DEBUG #include PFNGLCREATESHADERPROGRAMEXTPROC glCreateShaderProgram = NULL; PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL; PFNGLUSEPROGRAMPROC glUseProgram = NULL; PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = NULL; void useProgram(GLhandleARB ah_Program) { glUseProgram(ah_Program); } void initShaders() { glGetProgramiv = (PFNGLGETPROGRAMIVPROC)myGetProcAddress("glGetProgramiv"); glUseProgram = (PFNGLUSEPROGRAMPROC)myGetProcAddress("glUseProgram"); glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)myGetProcAddress("glGetProgramInfoLog"); glCreateShaderProgram = (PFNGLCREATESHADERPROGRAMEXTPROC)myGetProcAddress("glCreateShaderProgramEXT"); if (!(glCreateShaderProgram && glGetProgramiv && glUseProgram && glGetProgramInfoLog)) { std::cerr << "Some shader functions are not available!" << std::endl; } } void PrintErrors() { GLenum lr_Error = GL_NO_ERROR; int li_ErrorCount = 5; do { lr_Error = glGetError(); if (lr_Error != GL_NO_ERROR) { li_ErrorCount--; char* ls_ErrorString = (char*)gluErrorString(lr_Error); if (ls_ErrorString != 0) std::cout << "OPENGL :: ERROR " << ls_ErrorString << std::endl; } if (li_ErrorCount == 0) { std::cout << "OPENGL :: ERROR Too many errors!" << std::endl; break; } } while (lr_Error != GL_NO_ERROR); } GLhandleARB createFragmentProgram(const char* as_FileName) { GLhandleARB lh_Program = 0; char* ls_ShaderSource = textFileRead(as_FileName); if (ls_ShaderSource == NULL) { std::cerr << "Error reading file: " << as_FileName << std::endl; return lh_Program; } lh_Program = glCreateShaderProgram(GL_FRAGMENT_SHADER, ls_ShaderSource); printProgramInfoLog(lh_Program); return lh_Program; } char* textFileRead(const char* as_FileName) { FILE* lh_File; char* ls_Content = NULL; size_t li_Count = 0; if (as_FileName != NULL) { fopen_s(&lh_File, as_FileName, "rt"); if (lh_File != NULL) { fseek(lh_File, 0, SEEK_END); li_Count = ftell(lh_File); rewind(lh_File); if (li_Count > 0) { ls_Content = (char*) malloc(sizeof(char) * (li_Count + 1)); li_Count = fread(ls_Content, sizeof(char), li_Count, lh_File); ls_Content[li_Count] = '\0'; } fclose(lh_File); } } return ls_Content; } void printProgramInfoLog(GLhandleARB ah_Program) { int li_InfologLength = 0; int li_CharsWritten = 0; char* ls_InfoLog; glGetProgramiv(ah_Program, GL_INFO_LOG_LENGTH, &li_InfologLength); if (li_InfologLength > 0) { ls_InfoLog = (char *)malloc(li_InfologLength); glGetProgramInfoLog(ah_Program, li_InfologLength, &li_CharsWritten, ls_InfoLog); std::cerr << ls_InfoLog << std::endl; free(ls_InfoLog); } } #endif