import glslUtil; use for creating shaders/program

This commit is contained in:
Josh Holtrop 2011-05-16 15:55:22 -04:00
parent f672782921
commit 1a1bdf64ce
5 changed files with 27 additions and 115 deletions

3
.gitmodules vendored
View File

@ -4,3 +4,6 @@
[submodule "loadTexture"] [submodule "loadTexture"]
path = loadTexture path = loadTexture
url = ../loadTexture.git url = ../loadTexture.git
[submodule "glslUtil"]
path = glslUtil
url = ../glslUtil.git

View File

@ -4,11 +4,12 @@ import os
import sys import sys
env = Environment(LIBS = ['GL', 'GLU', 'SDL_image'], env = Environment(LIBS = ['GL', 'GLU', 'SDL_image'],
CFLAGS = ['-Wall'], CFLAGS = ['-Wall', '-DGL_GLEXT_PROTOTYPES'],
CXXFLAGS = ['-Wall']) CXXFLAGS = ['-Wall', '-DGL_GLEXT_PROTOTYPES'])
env.ParseConfig('sdl-config --cflags --libs') env.ParseConfig('sdl-config --cflags --libs')
sources = [Glob('*.cc'), Glob('wfobj/WFObj.cc'), Glob('loadTexture/*.c')] sources = [Glob('*.cc'), Glob('wfobj/WFObj.cc'), Glob('loadTexture/*.c'),
Glob('glslUtil/*.c')]
env.Program('wfobj-view', sources) env.Program('wfobj-view', sources)
if len(os.listdir('wfobj')) == 0: if len(os.listdir('wfobj')) == 0:

1
glslUtil Submodule

@ -0,0 +1 @@
Subproject commit 060f3115bf0f1f659dd44ef3738c12327ec2ef43

2
wfobj

@ -1 +1 @@
Subproject commit 08e558482f1b79ff8119c426de2ff6156fd470dc Subproject commit 1ecc6d749be3bc3f5dc0de230b5e8e3ca079377a

View File

@ -1,6 +1,5 @@
/* Libraries we use */ /* Libraries we use */
#define GL_GLEXT_PROTOTYPES
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
@ -10,6 +9,7 @@
#include <iostream> #include <iostream>
#include "wfobj/WFObj.h" #include "wfobj/WFObj.h"
#include "loadTexture/loadTexture.h" #include "loadTexture/loadTexture.h"
#include "glslUtil/glslUtil.h"
using namespace std; using namespace std;
/* Some definitions */ /* Some definitions */
@ -40,7 +40,7 @@ private:
int m_startx, m_starty; int m_startx, m_starty;
bool m_dragging; bool m_dragging;
float m_dist; float m_dist;
GLuint m_program, m_vs, m_fs; GLuint m_program;
GLint m_ambient_loc, m_diffuse_loc, m_specular_loc, m_shininess_loc; GLint m_ambient_loc, m_diffuse_loc, m_specular_loc, m_shininess_loc;
}; };
@ -56,90 +56,6 @@ static GLuint load_texture(const char *fname)
return id; return id;
} }
char * loadFile(const char *fname)
{
struct stat st;
if (stat(fname, &st) != 0)
return NULL;
if (st.st_size <= 0)
return NULL;
char * buff = new char[st.st_size + 1];
int fd = open(fname, O_RDONLY);
read(fd, buff, st.st_size);
close(fd);
buff[st.st_size] = '\0';
return buff;
}
char *getShaderLog(GLuint id)
{
GLint log_length;
glGetShaderiv(id, GL_INFO_LOG_LENGTH, &log_length);
if (log_length > 0)
{
char *log = new char[log_length];
glGetShaderInfoLog(id, log_length, &log_length, log);
return log;
}
return NULL;
}
char *getProgramLog(GLuint id)
{
GLint log_length;
glGetProgramiv(id, GL_INFO_LOG_LENGTH, &log_length);
if (log_length > 0)
{
char *log = new char[log_length];
glGetProgramInfoLog(id, log_length, &log_length, log);
return log;
}
return NULL;
}
GLuint makeShader(GLenum shaderType, const char *fname)
{
GLuint id;
const char *source;
GLint status;
id = glCreateShader(shaderType);
if (id <= 0)
{
cerr << "Error creating shader object" << endl;
goto out;
}
source = loadFile(fname);
if (source == NULL)
{
fprintf(stderr, "Error reading file '%s'\n", fname);
goto cleanup_shader;
}
glShaderSource(id, 1, &source, NULL);
delete[] source;
glCompileShader(id);
glGetShaderiv(id, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE)
{
cerr << "Error compiling shader" << endl;
char *log = getShaderLog(id);
cerr << "Shader Log:" << endl << log << endl;
delete[] log;
goto cleanup_shader;
}
return id;
cleanup_shader:
glDeleteShader(id);
out:
return 0;
}
/* The program's main entry point */ /* The program's main entry point */
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
@ -183,38 +99,29 @@ Viewer::Viewer(const char * filename)
exit(1); exit(1);
} }
m_vs = makeShader(GL_VERTEX_SHADER, "v_shader.glsl"); const static guAttribBinding bindings[] = {
m_fs = makeShader(GL_FRAGMENT_SHADER, "f_shader.glsl"); {LOC_POSITION, "pos"},
{LOC_NORMAL, "normal"},
m_program = glCreateProgram(); {0, NULL}
glAttachShader(m_program, m_vs); };
glAttachShader(m_program, m_fs); m_program = guMakeProgramFromFiles("v_shader.glsl", "f_shader.glsl",
bindings);
glBindAttribLocation(m_program, LOC_POSITION, "pos"); if (m_program == 0)
glBindAttribLocation(m_program, LOC_NORMAL, "normal");
glLinkProgram(m_program);
GLint link_status;
glGetProgramiv(m_program, GL_LINK_STATUS, &link_status);
if (link_status != GL_TRUE)
{ {
char *log = getProgramLog(m_program);
cerr << "Program log:" << endl << log << endl;
delete[] log;
glDeleteShader(m_vs);
glDeleteShader(m_fs);
exit(1); exit(1);
} }
m_ambient_loc = glGetUniformLocation(m_program, "ambient"); guUniformLocation uniforms[] = {
m_diffuse_loc = glGetUniformLocation(m_program, "diffuse"); {&m_ambient_loc, "ambient"},
m_specular_loc = glGetUniformLocation(m_program, "specular"); {&m_diffuse_loc, "diffuse"},
m_shininess_loc = glGetUniformLocation(m_program, "shininess"); {&m_specular_loc, "specular"},
{&m_shininess_loc, "shininess"},
{NULL, NULL}
};
guGetUniformLocations(m_program, uniforms);
if (m_ambient_loc < 0 || m_diffuse_loc < 0 || m_specular_loc < 0 if (m_ambient_loc < 0 || m_diffuse_loc < 0 || m_specular_loc < 0
|| m_shininess_loc < 0) || m_shininess_loc < 0)
{ {
cerr << "glGetUniformLocation() returned < 0" << endl;
exit(1); exit(1);
} }