aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortaw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5>2008-08-06 11:57:50 +0000
committertaw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5>2008-08-06 11:57:50 +0000
commitbe186c70322fc3e00b9e79c5a0c0f504fb7f3f17 (patch)
tree814b7dcb31b1019a0123fff36c599bb1ba70642d /src
parenta655a74010577609339013065eecdb9024f0aa1b (diff)
Simplify shaders by moving fill-in light to a separate program
git-svn-id: svn://cook.msm.cam.ac.uk:745/thrust3d/thrust3d@218 84d2e878-0bd5-11dd-ad15-13eda11d74c5
Diffstat (limited to 'src')
-rw-r--r--src/render.c29
-rw-r--r--src/types.h3
2 files changed, 27 insertions, 5 deletions
diff --git a/src/render.c b/src/render.c
index ce25c5e..26d1dcc 100644
--- a/src/render.c
+++ b/src/render.c
@@ -40,6 +40,15 @@ static void render_load_shaders(RenderContext *r) {
shaderutils_link_program(r->lighting_program);
shaderutils_validate_program(r->lighting_program);
+ /* Fill-in light */
+ r->fill_vert = shaderutils_load_shader(DATADIR"/shaders/fill-light.vert", GL_VERTEX_SHADER);
+ r->fill_frag = shaderutils_load_shader(DATADIR"/shaders/fill-light.frag", GL_FRAGMENT_SHADER);
+ r->fill_program = glCreateProgram();
+ glAttachShader(r->fill_program, r->fill_vert);
+ glAttachShader(r->fill_program, r->fill_frag);
+ shaderutils_link_program(r->fill_program);
+ shaderutils_validate_program(r->fill_program);
+
/* Swirlyness */
r->swirly_vert = shaderutils_load_shader(DATADIR"/shaders/swirlytron.vert", GL_VERTEX_SHADER);
r->swirly_frag = shaderutils_load_shader(DATADIR"/shaders/swirlytron.frag", GL_FRAGMENT_SHADER);
@@ -58,6 +67,18 @@ static void render_delete_shaders(RenderContext *r) {
glDeleteShader(r->lighting_vert);
glDeleteShader(r->lighting_frag);
glDeleteProgram(r->lighting_program);
+
+ glDetachShader(r->fill_program, r->fill_frag);
+ glDetachShader(r->fill_program, r->fill_vert);
+ glDeleteShader(r->fill_vert);
+ glDeleteShader(r->fill_frag);
+ glDeleteProgram(r->fill_program);
+
+ glDetachShader(r->swirly_program, r->swirly_frag);
+ glDetachShader(r->swirly_program, r->swirly_vert);
+ glDeleteShader(r->swirly_vert);
+ glDeleteShader(r->swirly_frag);
+ glDeleteProgram(r->swirly_program);
}
@@ -604,7 +625,6 @@ void render_draw(Game *game, Uint32 t) {
shaderutils_setuni(game->render->lighting_program, "texture_only", 0);
shaderutils_setuni(game->render->lighting_program, "texture_enabled", 1);
shaderutils_setuni(game->render->lighting_program, "has_normals", 0);
- shaderutils_setuni(game->render->lighting_program, "fill_light_enabled", 0);
}
render_setup_lighting(game);
amb[0] = 0.02; amb[1] = 0.02; amb[2] = 0.02;
@@ -619,17 +639,16 @@ void render_draw(Game *game, Uint32 t) {
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if ( r->shaders ) shaderutils_setuni(game->render->lighting_program, "fill_light_enabled", 1);
+ if ( r->shaders ) glUseProgram(game->render->fill_program);
render_model_instance_draw(game->lander, t, r, NULL, 1.0);
- if ( r->shaders ) shaderutils_setuni(game->render->lighting_program, "fill_light_enabled", 0);
glPopClientAttrib();
- if ( r->shaders ) shaderutils_setuni(game->render->lighting_program, "texture_enabled", 0);
+ if ( r->shaders ) glUseProgram(0);
render_draw_line(game->lander->x, game->lander->y, game->lander->z,
game->lander->x, game->lander->y, game->lander->z-200.0);
glDisable(GL_LIGHT2);
/* Back faces (done last to make blending work properly) */
- if ( r->shaders ) glUseProgram(0); /* Speed things up a bit by not using per-fragment lighting */
+ /* Shaders still disabled (speeds this up a lot) */
glFrontFace(GL_CW);
glPolygonOffset(1.0, 1.0);
glEnable(GL_POLYGON_OFFSET_FILL);
diff --git a/src/types.h b/src/types.h
index f601d95..550d931 100644
--- a/src/types.h
+++ b/src/types.h
@@ -139,6 +139,9 @@ typedef struct {
GLuint lighting_vert;
GLuint lighting_frag;
GLuint lighting_program;
+ GLuint fill_vert;
+ GLuint fill_frag;
+ GLuint fill_program;
/* Textures */
Texture textures[MAX_TEXTURES];