2008-05-27 13:42:50 -04:00
|
|
|
/* Per vertex attributes */
|
2008-05-28 13:14:17 -04:00
|
|
|
attribute vec4 vertex_attrib;
|
|
|
|
attribute vec4 tex_coord_attrib;
|
|
|
|
attribute vec4 color_attrib;
|
2008-05-27 13:42:50 -04:00
|
|
|
|
|
|
|
/* Transformation matrices */
|
2008-05-28 13:14:17 -04:00
|
|
|
uniform mat4 modelview_matrix;
|
|
|
|
uniform mat4 mvp_matrix; /* combined modelview and projection matrix */
|
|
|
|
uniform mat4 texture_matrix;
|
2008-05-27 13:42:50 -04:00
|
|
|
|
|
|
|
/* Outputs to the fragment shader */
|
2008-05-28 13:14:17 -04:00
|
|
|
varying vec4 frag_color;
|
|
|
|
varying vec2 tex_coord;
|
|
|
|
varying float fog_amount;
|
|
|
|
|
|
|
|
/* Fogging options */
|
|
|
|
uniform bool fog_enabled;
|
|
|
|
uniform int fog_mode;
|
|
|
|
uniform float fog_density;
|
|
|
|
uniform float fog_start;
|
|
|
|
uniform float fog_end;
|
|
|
|
|
|
|
|
/* Fogging modes */
|
|
|
|
const int GL_LINEAR = 0x2601;
|
|
|
|
const int GL_EXP = 0x0800;
|
|
|
|
const int GL_EXP2 = 0x0801;
|
2008-05-27 13:42:50 -04:00
|
|
|
|
|
|
|
void
|
|
|
|
main (void)
|
|
|
|
{
|
|
|
|
/* Calculate the transformed position */
|
|
|
|
gl_Position = mvp_matrix * vertex_attrib;
|
|
|
|
|
|
|
|
/* Calculate the transformed texture coordinate */
|
|
|
|
vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib;
|
|
|
|
tex_coord = transformed_tex_coord.st / transformed_tex_coord.q;
|
|
|
|
|
|
|
|
/* Pass the interpolated vertex color on to the fragment shader */
|
|
|
|
frag_color = color_attrib;
|
2008-05-28 13:14:17 -04:00
|
|
|
|
|
|
|
if (fog_enabled)
|
|
|
|
{
|
|
|
|
/* Estimate the distance from the eye using just the
|
|
|
|
z-coordinate to use as the fog coord */
|
|
|
|
vec4 eye_coord = modelview_matrix * vertex_attrib;
|
|
|
|
float fog_coord = abs (eye_coord.z / eye_coord.w);
|
|
|
|
|
|
|
|
/* Calculate the fog amount per-vertex and interpolate it for
|
|
|
|
the fragment shader */
|
|
|
|
if (fog_mode == GL_EXP)
|
|
|
|
fog_amount = exp (-fog_density * fog_coord);
|
|
|
|
else if (fog_mode == GL_EXP2)
|
|
|
|
fog_amount = exp (-fog_density * fog_coord
|
|
|
|
* fog_density * fog_coord);
|
|
|
|
else
|
|
|
|
fog_amount = (fog_end - fog_coord) / (fog_end - fog_start);
|
|
|
|
|
|
|
|
fog_amount = clamp (fog_amount, 0.0, 1.0);
|
|
|
|
}
|
2008-05-27 13:42:50 -04:00
|
|
|
}
|