/*
* @topic T0L043 Hello, triangle!
* @brief OpenGL client program
*/
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <stdio.h>
// main_Lecture04.cpp
// shader path configuration:
#define BCC_PROJECT_NAME "Lecture04_Shaders"
#define BCC_ROOT_PATH "../../example/"
#define BCC_VERTEX_SHADER BCC_ROOT_PATH BCC_PROJECT_NAME "/Shaders/vertexProgram_v.c"
#define BCC_FRAGMENT_SHADER BCC_ROOT_PATH BCC_PROJECT_NAME "/Shaders/fragmentProgram_f.c"
static char* load_text_file(const char* filename) {
// Open the file
FILE* fp = fopen (filename, "r");
// Move the file pointer to the end of the file and determing the length
fseek(fp, 0, SEEK_END);
long file_length = ftell(fp);
fseek(fp, 0, SEEK_SET);
char* contents = new char[file_length+1];
// zero out memory
for (int i = 0; i < file_length+1; i++) {
contents[i] = 0;
}
// Here's the actual read
fread (contents, 1, file_length, fp);
// This is how you denote the end of a string in C
contents[file_length] = '\0';
fclose(fp);
return contents;
}
GLuint compile_vertex_shader(const char* shader_source) {
GLuint vertex_shader_ID = glCreateShader(GL_VERTEX_SHADER);
glShaderSource (vertex_shader_ID, 1, (const GLchar**)&shader_source, NULL);
glCompileShader(vertex_shader_ID);
return vertex_shader_ID;
}
GLuint compile_fragment_shader(const char* shader_source) {
GLuint fragment_shader_ID = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader_ID, 1, (const GLchar**)&shader_source, NULL);
glCompileShader(fragment_shader_ID);
return fragment_shader_ID;
}
GLuint link_shader_program (GLuint vertex_shader_ID, GLuint fragment_shader_ID) {
GLuint shader_ID = glCreateProgram();
glAttachShader(shader_ID, vertex_shader_ID);
glAttachShader(shader_ID, fragment_shader_ID);
glLinkProgram(shader_ID);
return shader_ID;
}
int main (int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(800, 600);
glutCreateWindow("Shaders");
glewInit();
char* cstr_vertex_shader_source = load_text_file( BCC_VERTEX_SHADER );
char* cstr_fragment_shader_source = load_text_file( BCC_FRAGMENT_SHADER );
GLuint vert_shader_ID = compile_vertex_shader(cstr_vertex_shader_source);
GLuint frag_shader_ID = compile_fragment_shader(cstr_fragment_shader_source);
GLuint shader_program_ID = link_shader_program(vert_shader_ID, frag_shader_ID);
glUseProgram(shader_program_ID);
printf ("vert_shader_ID is %d\n", vert_shader_ID);
printf ("frag_shader_ID is %d\n", frag_shader_ID);
printf ("shader_program_ID is %d\n", shader_program_ID);
glDeleteProgram(shader_program_ID);
int temp;
scanf ("%d", &temp);
return 0;
}