build and use texture program/shaders

This commit is contained in:
Josh Holtrop 2011-05-16 16:04:22 -04:00
parent 1a1bdf64ce
commit 1c5b95a9fd

View File

@ -40,8 +40,10 @@ 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; GLuint m_program, m_tex_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;
GLint m_tex_ambient_loc, m_tex_specular_loc, m_tex_shininess_loc,
m_tex_tex_loc;
}; };
static GLuint load_texture(const char *fname) static GLuint load_texture(const char *fname)
@ -106,7 +108,16 @@ Viewer::Viewer(const char * filename)
}; };
m_program = guMakeProgramFromFiles("v_shader.glsl", "f_shader.glsl", m_program = guMakeProgramFromFiles("v_shader.glsl", "f_shader.glsl",
bindings); bindings);
if (m_program == 0)
const static guAttribBinding tex_bindings[] = {
{LOC_POSITION, "pos"},
{LOC_NORMAL, "normal"},
{LOC_TEXTURE, "tex_coord"},
{0, NULL}
};
m_tex_program = guMakeProgramFromFiles("v_tex_shader.glsl",
"f_tex_shader.glsl", tex_bindings);
if (m_program == 0 || m_tex_program == 0)
{ {
exit(1); exit(1);
} }
@ -119,11 +130,15 @@ Viewer::Viewer(const char * filename)
{NULL, NULL} {NULL, NULL}
}; };
guGetUniformLocations(m_program, uniforms); guGetUniformLocations(m_program, uniforms);
if (m_ambient_loc < 0 || m_diffuse_loc < 0 || m_specular_loc < 0
|| m_shininess_loc < 0) guUniformLocation tex_uniforms[] = {
{ {&m_tex_ambient_loc, "ambient"},
exit(1); {&m_tex_specular_loc, "specular"},
} {&m_tex_shininess_loc, "shininess"},
{&m_tex_tex_loc, "tex"},
{NULL, NULL}
};
guGetUniformLocations(m_tex_program, tex_uniforms);
glUseProgram(m_program); glUseProgram(m_program);
glUniform4f(m_ambient_loc, 0.2, 0.2, 0.2, 1.0); glUniform4f(m_ambient_loc, 0.2, 0.2, 0.2, 1.0);
@ -131,6 +146,11 @@ Viewer::Viewer(const char * filename)
glUniform4f(m_specular_loc, 1.0, 1.0, 1.0, 1.0); glUniform4f(m_specular_loc, 1.0, 1.0, 1.0, 1.0);
glUniform1f(m_shininess_loc, 85.0); glUniform1f(m_shininess_loc, 85.0);
glUseProgram(m_tex_program);
glUniform4f(m_tex_ambient_loc, 0.2, 0.2, 0.2, 1.0);
glUniform4f(m_tex_specular_loc, 1.0, 1.0, 1.0, 1.0);
glUniform1f(m_tex_shininess_loc, 85.0);
/* Print out the object's size */ /* Print out the object's size */
const float * aabb = m_obj.getAABB(); const float * aabb = m_obj.getAABB();
cout << "Object width: " << (aabb[3]-aabb[0]) << endl; cout << "Object width: " << (aabb[3]-aabb[0]) << endl;
@ -165,6 +185,7 @@ void Viewer::display()
glMultMatrixf(m_rotationMatrix); glMultMatrixf(m_rotationMatrix);
m_obj.bindBuffers(); m_obj.bindBuffers();
GLuint program = m_program;
glUseProgram(m_program); glUseProgram(m_program);
glEnableVertexAttribArray(LOC_POSITION); glEnableVertexAttribArray(LOC_POSITION);
glEnableVertexAttribArray(LOC_NORMAL); glEnableVertexAttribArray(LOC_NORMAL);
@ -194,7 +215,21 @@ void Viewer::display()
glUniform4fv(m_specular_loc, 1, &m.specular[0]); glUniform4fv(m_specular_loc, 1, &m.specular[0]);
if (m.flags & WFObj::Material::TEXTURE_BIT) if (m.flags & WFObj::Material::TEXTURE_BIT)
{ {
cerr << "error: textured materials not implemented yet" << endl; if (program != m_tex_program)
{
glUseProgram(m_tex_program);
program = m_tex_program;
glEnableVertexAttribArray(LOC_TEXTURE);
}
}
else
{
if (program != m_program)
{
glUseProgram(m_program);
program = m_program;
glDisableVertexAttribArray(LOC_TEXTURE);
}
} }
glDrawElements(GL_TRIANGLES, m.num_vertices, glDrawElements(GL_TRIANGLES, m.num_vertices,
GL_UNSIGNED_SHORT, GL_UNSIGNED_SHORT,