119 lines
2.7 KiB
C++
119 lines
2.7 KiB
C++
#include "Shaders.h"
|
|
|
|
#ifdef _DEBUG
|
|
|
|
#include <gl/GLU.h>
|
|
|
|
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 |