import glslUtil; use for creating shaders/program
This commit is contained in:
parent
f672782921
commit
1a1bdf64ce
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -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
|
||||||
|
@ -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
1
glslUtil
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 060f3115bf0f1f659dd44ef3738c12327ec2ef43
|
2
wfobj
2
wfobj
@ -1 +1 @@
|
|||||||
Subproject commit 08e558482f1b79ff8119c426de2ff6156fd470dc
|
Subproject commit 1ecc6d749be3bc3f5dc0de230b5e8e3ca079377a
|
129
wfobj-view.cc
129
wfobj-view.cc
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user