From be186c70322fc3e00b9e79c5a0c0f504fb7f3f17 Mon Sep 17 00:00:00 2001 From: taw27 Date: Wed, 6 Aug 2008 11:57:50 +0000 Subject: 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 --- src/render.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'src/render.c') 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); -- cgit v1.2.3