1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
/*
* shaders.cpp
* Sludge Engine
*
* Created by Rikard Peterson on 2009-12-29.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "debug.h"
#include "stringy.h"
#include "shaders.h"
#include "graphics.h"
extern char *bundleFolder;
//Function from: http://www.evl.uic.edu/aej/594/code/ogl.cpp
//Read in a textfile (GLSL program)
// we need to pass it as a string to the GLSL driver
char *shaderFileRead(const char *name)
{
FILE *fp;
char *content = NULL;
char * fn = joinStrings (bundleFolder, name);
int count=0;
if (fn != NULL) {
fp = fopen(fn,"rt");
if (fp != NULL) {
fseek(fp, 0, SEEK_END);
count = ftell(fp);
rewind(fp);
if (count > 0) {
content = (char *)malloc(sizeof(char) * (count+1));
count = fread(content,sizeof(char),count,fp);
content[count] = '\0';
}
fclose(fp);
}
}
delete fn;
return content;
}
static void
printShaderInfoLog (GLuint shader)
{
GLint infologLength = 0;
GLint charsWritten = 0;
char *infoLog;
printOpenGLError (); // Check for OpenGL errors
glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &infologLength);
printOpenGLError (); // Check for OpenGL errors
if (infologLength > 0)
{
infoLog = new char [infologLength];
if (infoLog == NULL)
{
debugOut("ERROR: Could not allocate InfoLog buffer");
return;
}
glGetShaderInfoLog (shader, infologLength, &charsWritten, infoLog);
debugOut("Shader InfoLog:\n%s\n\n", infoLog);
delete[] infoLog;
}
printOpenGLError(); // Check for OpenGL errors
}
/* Print out the information log for a program object */
static void
printProgramInfoLog (GLuint program)
{
GLint infologLength = 0;
GLint charsWritten = 0;
char *infoLog;
printOpenGLError (); // Check for OpenGL errors
glGetProgramiv (program, GL_INFO_LOG_LENGTH, &infologLength);
printOpenGLError (); // Check for OpenGL errors
if (infologLength > 0)
{
infoLog = new char [infologLength];
if (infoLog == NULL)
{
debugOut( "ERROR: Could not allocate InfoLog buffer");
return;
}
glGetProgramInfoLog (program, infologLength, &charsWritten, infoLog);
debugOut( "Program InfoLog:\n%s\n\n", infoLog);
delete[] infoLog;
}
printOpenGLError (); // Check for OpenGL errors
}
int buildShaders (const char *vertexShader, const char *fragmentShader)
{
GLuint VS, FS, prog;
GLint vertCompiled, fragCompiled;
GLint linked;
// Create Shader Objects
VS = glCreateShader(GL_VERTEX_SHADER);
FS = glCreateShader(GL_FRAGMENT_SHADER);
// Load source code strings into shaders
glShaderSource(VS, 1, &vertexShader, NULL);
glShaderSource(FS, 1, &fragmentShader, NULL);
debugOut("Compiling vertex shader... \n");
// Compile vertex shader and print log
glCompileShader(VS);
printOpenGLError();
glGetShaderiv(VS, GL_COMPILE_STATUS, &vertCompiled);
printShaderInfoLog (VS);
debugOut("\nCompiling fragment shader... \n");
// Compile fragment shader and print log
glCompileShader(FS);
printOpenGLError();
glGetShaderiv(FS, GL_COMPILE_STATUS, &fragCompiled);
printShaderInfoLog (FS);
if (!vertCompiled || !fragCompiled)
return 0;
debugOut( "\nShaders compiled. \n");
// Create a program object and attach the two compiled shaders
prog = glCreateProgram();
glAttachShader(prog, VS);
glAttachShader(prog, FS);
// Clean up
glDeleteShader (VS);
glDeleteShader (FS);
// Link the program and print log
glLinkProgram(prog);
printOpenGLError();
glGetProgramiv(prog, GL_LINK_STATUS, &linked);
printProgramInfoLog(prog);
if (!linked)
return 0;
debugOut("Shader program linked. \n");
return prog;
}
|