aboutsummaryrefslogtreecommitdiff
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
commit610231f47989858c7a17c3387c0d11fbccf0edb9 (patch)
tree04e64712b4f54e5fe922eaa32a8ae2a88bec1855
parent3a60f1731be90d6d3c81debfdb530ca4dc383193 (diff)
Shader optimisations (use blank texture when none specified)
git-svn-id: svn://cook.msm.cam.ac.uk:745/thrust3d/thrust3d@220 84d2e878-0bd5-11dd-ad15-13eda11d74c5
-rw-r--r--data/Makefile.am2
-rw-r--r--data/shaders/fill-light.frag49
-rw-r--r--data/shaders/fill-light.vert2
-rw-r--r--data/shaders/lighting.frag49
-rw-r--r--data/textures/placeholder.pngbin0 -> 209 bytes
-rw-r--r--src/render.c26
6 files changed, 53 insertions, 75 deletions
diff --git a/data/Makefile.am b/data/Makefile.am
index b818d11..beca98a 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -9,7 +9,7 @@ shaders_DATA = shaders/lighting.vert shaders/lighting.frag shaders/swirlytron.ve
texturesdir = $(datadir)/thrust3d/textures
textures_DATA = textures/floor1.png textures/tiledwall.png textures/radioactive.png textures/fuel.png \
- textures/font.png textures/concrete.png textures/tiledwall-normals.png
+ textures/font.png textures/concrete.png textures/tiledwall-normals.png textures/placeholder.png
roomsdir = $(datadir)/thrust3d/rooms
rooms_DATA = rooms/00-00-00 rooms/00-00-01 rooms/00-00-02 rooms/00-00-03 rooms/00-00-04 rooms/00-01-04 rooms/00-02-04
diff --git a/data/shaders/fill-light.frag b/data/shaders/fill-light.frag
index b9aba4c..6a7044e 100644
--- a/data/shaders/fill-light.frag
+++ b/data/shaders/fill-light.frag
@@ -1,7 +1,7 @@
/*
- * lighting.frag
+ * fill-light.frag
*
- * Lighting calculations
+ * Simplified lighting calculations for the lander craft
*
* (c) 2007-2008 Thomas White <taw27@cam.ac.uk>
*
@@ -18,8 +18,6 @@ uniform sampler2D texture;
uniform sampler2D normalmap;
uniform bool has_normals;
-uniform bool texture_enabled;
-uniform bool texture_emits;
uniform float alpha;
varying vec3 col_ambi_diff;
@@ -27,26 +25,26 @@ varying vec3 col_emit;
void main() {
- vec3 ambi;
- vec3 emit;
- vec3 diff = vec3(0.0, 0.0, 0.0);
- vec3 spec = vec3(0.0, 0.0, 0.0);
- vec3 norm = normal;
+ vec3 ambi, emit, diff, spec;
+ vec3 norm;
float diff_fac, spec_fac;
vec3 L, E, R;
+ vec3 tex;
+
+ tex = texture2D(texture, gl_TexCoord[0].st).rgb;
if ( has_normals ) {
norm += (texture2D(normalmap, gl_TexCoord[0].st).rgb - vec3(0.5, 0.5, 0.5)) / 2.0;
}
- norm = normalize(norm);
+ norm = normalize(normal);
/* Ambient */
ambi = col_ambi_diff * gl_LightModel.ambient.rgb;
/* Emission */
emit = col_emit;
-
+
/* Light 2: Fill-in for lander craft */
L = normalize(gl_LightSource[2].position.xyz - pos);
E = normalize(-pos);
@@ -54,31 +52,14 @@ void main() {
diff_fac = max(0.0, dot(normalize(light2vc).xyz, norm));
spec_fac = max(0.0, dot(R, E));
spec_fac = pow(spec_fac, 80.0);
-
- diff += col_ambi_diff * gl_LightSource[2].diffuse.rgb * diff_fac;
- spec += gl_LightSource[2].specular.rgb * spec_fac;
-
- if ( texture_enabled ) {
- vec3 tex = texture2D(texture, gl_TexCoord[0].st).rgb;
-
- if ( texture_emits ) {
- gl_FragColor = vec4(tex.r, tex.g, tex.b, alpha);
- } else {
- gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0),
- min(tex.g * (ambi.g + diff.g) + spec.g, 1.0),
- min(tex.b * (ambi.b + diff.b) + spec.b, 1.0),
- alpha);
- }
+ diff = col_ambi_diff * gl_LightSource[2].diffuse.rgb * diff_fac;
+ spec = gl_LightSource[2].specular.rgb * spec_fac;
- } else {
-
- gl_FragColor = vec4(min(emit.r + ambi.r + diff.r + spec.r, 1.0),
- min(emit.g + ambi.g + diff.g + spec.g, 1.0),
- min(emit.b + ambi.b + diff.b + spec.b, 1.0),
- alpha);
-
- }
+ gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0),
+ min(tex.g * (ambi.g + diff.g) + spec.g, 1.0),
+ min(tex.b * (ambi.b + diff.b) + spec.b, 1.0),
+ alpha);
}
diff --git a/data/shaders/fill-light.vert b/data/shaders/fill-light.vert
index 38dcfc9..bdcb844 100644
--- a/data/shaders/fill-light.vert
+++ b/data/shaders/fill-light.vert
@@ -1,7 +1,7 @@
/*
* fill-light.vert
*
- * Lighting calculations for the lander craft
+ * Simplified lighting calculations for the lander craft
*
* (c) 2007-2008 Thomas White <taw27@cam.ac.uk>
*
diff --git a/data/shaders/lighting.frag b/data/shaders/lighting.frag
index 39f39fc..632f870 100644
--- a/data/shaders/lighting.frag
+++ b/data/shaders/lighting.frag
@@ -13,17 +13,13 @@ varying vec3 pos;
varying vec3 normal;
varying vec3 light0vc;
-varying vec3 light0half;
varying vec3 light1vc;
varying vec3 light2vc;
-varying vec3 light2hvc;
uniform sampler2D texture;
uniform sampler2D normalmap;
uniform bool has_normals;
-uniform bool fill_light_enabled;
-uniform bool texture_enabled;
uniform bool texture_emits;
uniform float alpha;
@@ -32,21 +28,28 @@ varying vec3 col_emit;
void main() {
- vec3 ambi;
- vec3 emit;
- vec3 diff = vec3(0.0, 0.0, 0.0);
- vec3 spec = vec3(0.0, 0.0, 0.0);
- vec3 norm = normal;
+ vec3 ambi, emit, diff, spec;
+ vec3 norm;
float falloff, spot;
float diff_fac, spec_fac;
vec3 L, E, R;
+ vec3 tex;
+ tex = texture2D(texture, gl_TexCoord[0].st).rgb;
+ if ( texture_emits ) {
+ gl_FragColor = vec4(tex.r, tex.g, tex.b, alpha);
+ return; /* Bail out early in this case */
+ }
+
+ diff = vec3(0.0, 0.0, 0.0);
+ spec = vec3(0.0, 0.0, 0.0);
+
+ norm = normalize(normal);
if ( has_normals ) {
+ /* Same texture coordinates as for the diffuse map */
norm += (texture2D(normalmap, gl_TexCoord[0].st).rgb - vec3(0.5, 0.5, 0.5)) / 2.0;
}
- norm = normalize(norm);
-
/* Ambient */
ambi = col_ambi_diff * gl_LightModel.ambient.rgb;
@@ -70,33 +73,15 @@ void main() {
spec_fac = pow(spec_fac, 80.0);
diff += col_ambi_diff * gl_LightSource[0].diffuse.rgb * spot * falloff * diff_fac;
-
spec += vec3(1.0, 1.0, 1.0) * gl_LightSource[0].specular.rgb * spot * falloff * spec_fac;
/* Light 1: Diffuse background glow */
diff += col_ambi_diff * gl_LightSource[1].diffuse.rgb * max(0.0, dot(vec3(light1vc), norm));
- if ( texture_enabled ) {
-
- vec3 tex = texture2D(texture, gl_TexCoord[0].st).rgb;
-
- if ( texture_emits ) {
- gl_FragColor = vec4(tex.r, tex.g, tex.b, alpha);
- } else {
- gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0),
- min(tex.g * (ambi.g + diff.g) + spec.g, 1.0),
- min(tex.b * (ambi.b + diff.b) + spec.b, 1.0),
- alpha);
- }
-
- } else {
-
- gl_FragColor = vec4(min(emit.r + ambi.r + diff.r + spec.r, 1.0),
- min(emit.g + ambi.g + diff.g + spec.g, 1.0),
- min(emit.b + ambi.b + diff.b + spec.b, 1.0),
+ gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0),
+ min(tex.g * (ambi.g + diff.g) + spec.g, 1.0),
+ min(tex.b * (ambi.b + diff.b) + spec.b, 1.0),
alpha);
- }
-
}
diff --git a/data/textures/placeholder.png b/data/textures/placeholder.png
new file mode 100644
index 0000000..5eda9f1
--- /dev/null
+++ b/data/textures/placeholder.png
Binary files differ
diff --git a/src/render.c b/src/render.c
index 26d1dcc..84de330 100644
--- a/src/render.c
+++ b/src/render.c
@@ -185,6 +185,7 @@ RenderContext *render_setup(int width, int height, int disable_vbos, int disable
/* Load misc texture bits */
texture_load(r, "radioactive");
texture_load(r, "fuel");
+ texture_load(r, "placeholder");
render_text_setup(r);
@@ -209,6 +210,20 @@ static GLenum render_gltype(PrimitiveType type) {
}
+static void render_placeholder_texture(RenderContext *r) {
+
+ Texture *texture;
+
+ texture = texture_lookup(r, "placeholder");
+ if ( texture != NULL ) {
+ glBindTexture(GL_TEXTURE_2D, texture->texname);
+ glEnable(GL_TEXTURE_2D);
+ } else {
+ fprintf(stderr, "Couldn't find placeholder texture!\n");
+ }
+
+}
+
static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderContext *r, int *nvert, GLfloat alpha) {
int j;
@@ -271,9 +286,8 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
shaderutils_setuni(r->lighting_program, "texture_emits", 1);
} else {
- if ( r->shaders ) {
- shaderutils_setuni(r->lighting_program, "texture_enabled", 0);
- } /* else don't enable texturing */
+ if ( r->shaders ) render_placeholder_texture(r);
+ /* else don't glEnable() texturing */
}
} else if ( p->texture != NULL ) {
Texture *texture;
@@ -282,7 +296,6 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC
glBindTexture(GL_TEXTURE_2D, texture->texname);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 1);
if ( r->shaders && texture->has_normals ) {
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture->normalmap);
@@ -290,10 +303,10 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC
glActiveTexture(GL_TEXTURE0);
}
} else {
- if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 0);
+ if ( r->shaders ) render_placeholder_texture(r);
}
} else {
- if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 0);
+ if ( r->shaders ) render_placeholder_texture(r);
}
if ( r->vbos ) {
glBindBuffer(GL_ARRAY_BUFFER, p->vertices_buffer);
@@ -623,7 +636,6 @@ void render_draw(Game *game, Uint32 t) {
shaderutils_setuni(game->render->lighting_program, "texture", 0); /* GL_TEXTURE0 */
shaderutils_setuni(game->render->lighting_program, "normalmap", 1); /* GL_TEXTURE1 */
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);
}
render_setup_lighting(game);