mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 08:30:42 -05:00
* clutter/cogl/gles/cogl-gles2-wrapper.c
(cogl_gles2_wrapper_init): Get uniforms for fog parameters and initialise them. (cogl_wrap_glDrawArrays): Store the modelview matrix in a uniform as well so that it can be used for fogging calculations. (cogl_wrap_glEnable, cogl_wrap_glDisable): Enable/disable fogging. (cogl_wrap_glFogx, cogl_wrap_glFogxv): Fill in wrapper to set fogging parameters. * clutter/cogl/gles/cogl-fixed-vertex-shader.glsl: Calculate the fog amount if fogging is enabled. * clutter/cogl/gles/cogl-fixed-fragment-shader.glsl: Mix with fog color. * clutter/cogl/gles/cogl-gles2-wrapper.h (CoglGles2Wrapper): Add uniforms for fogging.
This commit is contained in:
parent
a03ec45dff
commit
8d7bf93909
20
ChangeLog
20
ChangeLog
@ -1,3 +1,23 @@
|
|||||||
|
2008-05-28 Neil Roberts <neil@o-hand.com>
|
||||||
|
|
||||||
|
* clutter/cogl/gles/cogl-gles2-wrapper.c
|
||||||
|
(cogl_gles2_wrapper_init): Get uniforms for fog parameters and
|
||||||
|
initialise them.
|
||||||
|
(cogl_wrap_glDrawArrays): Store the modelview matrix in a uniform
|
||||||
|
as well so that it can be used for fogging calculations.
|
||||||
|
(cogl_wrap_glEnable, cogl_wrap_glDisable): Enable/disable fogging.
|
||||||
|
(cogl_wrap_glFogx, cogl_wrap_glFogxv): Fill in wrapper to set
|
||||||
|
fogging parameters.
|
||||||
|
|
||||||
|
* clutter/cogl/gles/cogl-fixed-vertex-shader.glsl: Calculate the
|
||||||
|
fog amount if fogging is enabled.
|
||||||
|
|
||||||
|
* clutter/cogl/gles/cogl-fixed-fragment-shader.glsl: Mix with fog
|
||||||
|
color.
|
||||||
|
|
||||||
|
* clutter/cogl/gles/cogl-gles2-wrapper.h (CoglGles2Wrapper): Add
|
||||||
|
uniforms for fogging.
|
||||||
|
|
||||||
2008-05-28 Emmanuele Bassi <ebassi@openedhand.com>
|
2008-05-28 Emmanuele Bassi <ebassi@openedhand.com>
|
||||||
|
|
||||||
* clutter/pango/pangoclutter-font.c: Remove unneeded file.
|
* clutter/pango/pangoclutter-font.c: Remove unneeded file.
|
||||||
|
@ -1,12 +1,17 @@
|
|||||||
/* Inputs from the vertex shader */
|
/* Inputs from the vertex shader */
|
||||||
varying vec4 frag_color;
|
varying vec4 frag_color;
|
||||||
varying vec2 tex_coord;
|
varying vec2 tex_coord;
|
||||||
|
varying float fog_amount;
|
||||||
|
|
||||||
/* Texturing options */
|
/* Texturing options */
|
||||||
uniform bool texture_2d_enabled;
|
uniform bool texture_2d_enabled;
|
||||||
uniform sampler2D texture_unit;
|
uniform sampler2D texture_unit;
|
||||||
uniform bool alpha_only;
|
uniform bool alpha_only;
|
||||||
|
|
||||||
|
/* Fogging options */
|
||||||
|
uniform bool fog_enabled;
|
||||||
|
uniform vec4 fog_color;
|
||||||
|
|
||||||
void
|
void
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
@ -26,4 +31,8 @@ main (void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
gl_FragColor = frag_color;
|
gl_FragColor = frag_color;
|
||||||
|
|
||||||
|
if (fog_enabled)
|
||||||
|
/* Mix the calculated color with the fog color */
|
||||||
|
gl_FragColor.rgb = mix (fog_color.rgb, gl_FragColor.rgb, fog_amount);
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,29 @@
|
|||||||
/* Per vertex attributes */
|
/* Per vertex attributes */
|
||||||
attribute vec4 vertex_attrib;
|
attribute vec4 vertex_attrib;
|
||||||
attribute vec4 tex_coord_attrib;
|
attribute vec4 tex_coord_attrib;
|
||||||
attribute vec4 color_attrib;
|
attribute vec4 color_attrib;
|
||||||
|
|
||||||
/* Transformation matrices */
|
/* Transformation matrices */
|
||||||
uniform mat4 mvp_matrix; /* combined modelview and projection matrix */
|
uniform mat4 modelview_matrix;
|
||||||
uniform mat4 texture_matrix;
|
uniform mat4 mvp_matrix; /* combined modelview and projection matrix */
|
||||||
|
uniform mat4 texture_matrix;
|
||||||
|
|
||||||
/* Outputs to the fragment shader */
|
/* Outputs to the fragment shader */
|
||||||
varying vec4 frag_color;
|
varying vec4 frag_color;
|
||||||
varying vec2 tex_coord;
|
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;
|
||||||
|
|
||||||
void
|
void
|
||||||
main (void)
|
main (void)
|
||||||
@ -23,4 +37,24 @@ main (void)
|
|||||||
|
|
||||||
/* Pass the interpolated vertex color on to the fragment shader */
|
/* Pass the interpolated vertex color on to the fragment shader */
|
||||||
frag_color = color_attrib;
|
frag_color = color_attrib;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,7 @@ void
|
|||||||
cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper)
|
cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper)
|
||||||
{
|
{
|
||||||
GLint status;
|
GLint status;
|
||||||
|
GLfixed default_fog_color[4] = { 0, 0, 0, 0 };
|
||||||
|
|
||||||
memset (wrapper, 0, sizeof (CoglGles2Wrapper));
|
memset (wrapper, 0, sizeof (CoglGles2Wrapper));
|
||||||
|
|
||||||
@ -139,6 +140,8 @@ cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper)
|
|||||||
|
|
||||||
wrapper->mvp_matrix_uniform
|
wrapper->mvp_matrix_uniform
|
||||||
= glGetUniformLocation (wrapper->program, "mvp_matrix");
|
= glGetUniformLocation (wrapper->program, "mvp_matrix");
|
||||||
|
wrapper->modelview_matrix_uniform
|
||||||
|
= glGetUniformLocation (wrapper->program, "modelview_matrix");
|
||||||
wrapper->texture_matrix_uniform
|
wrapper->texture_matrix_uniform
|
||||||
= glGetUniformLocation (wrapper->program, "texture_matrix");
|
= glGetUniformLocation (wrapper->program, "texture_matrix");
|
||||||
wrapper->texture_2d_enabled_uniform
|
wrapper->texture_2d_enabled_uniform
|
||||||
@ -148,6 +151,19 @@ cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper)
|
|||||||
wrapper->alpha_only_uniform
|
wrapper->alpha_only_uniform
|
||||||
= glGetUniformLocation (wrapper->program, "alpha_only");
|
= glGetUniformLocation (wrapper->program, "alpha_only");
|
||||||
|
|
||||||
|
wrapper->fog_enabled_uniform
|
||||||
|
= glGetUniformLocation (wrapper->program, "fog_enabled");
|
||||||
|
wrapper->fog_mode_uniform
|
||||||
|
= glGetUniformLocation (wrapper->program, "fog_mode");
|
||||||
|
wrapper->fog_density_uniform
|
||||||
|
= glGetUniformLocation (wrapper->program, "fog_density");
|
||||||
|
wrapper->fog_start_uniform
|
||||||
|
= glGetUniformLocation (wrapper->program, "fog_start");
|
||||||
|
wrapper->fog_end_uniform
|
||||||
|
= glGetUniformLocation (wrapper->program, "fog_end");
|
||||||
|
wrapper->fog_color_uniform
|
||||||
|
= glGetUniformLocation (wrapper->program, "fog_color");
|
||||||
|
|
||||||
/* Always use the first texture unit */
|
/* Always use the first texture unit */
|
||||||
glUniform1i (wrapper->bound_texture_uniform, 0);
|
glUniform1i (wrapper->bound_texture_uniform, 0);
|
||||||
|
|
||||||
@ -160,6 +176,14 @@ cogl_gles2_wrapper_init (CoglGles2Wrapper *wrapper)
|
|||||||
cogl_wrap_glLoadIdentity ();
|
cogl_wrap_glLoadIdentity ();
|
||||||
|
|
||||||
wrapper->mvp_uptodate = GL_FALSE;
|
wrapper->mvp_uptodate = GL_FALSE;
|
||||||
|
|
||||||
|
/* Initialize the fogging options */
|
||||||
|
cogl_wrap_glDisable (GL_FOG);
|
||||||
|
cogl_wrap_glFogx (GL_FOG_MODE, GL_LINEAR);
|
||||||
|
cogl_wrap_glFogx (GL_FOG_DENSITY, CFX_ONE);
|
||||||
|
cogl_wrap_glFogx (GL_FOG_START, 0);
|
||||||
|
cogl_wrap_glFogx (GL_FOG_END, 1);
|
||||||
|
cogl_wrap_glFogxv (GL_FOG_COLOR, default_fog_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -487,14 +511,17 @@ cogl_wrap_glDrawArrays (GLenum mode, GLint first, GLsizei count)
|
|||||||
if (!w->mvp_uptodate)
|
if (!w->mvp_uptodate)
|
||||||
{
|
{
|
||||||
float mvp_matrix[16];
|
float mvp_matrix[16];
|
||||||
|
const float *modelview_matrix = w->modelview_stack
|
||||||
|
+ w->modelview_stack_pos * 16;
|
||||||
|
|
||||||
cogl_gles2_wrapper_mult_matrix (mvp_matrix,
|
cogl_gles2_wrapper_mult_matrix (mvp_matrix,
|
||||||
w->projection_stack
|
w->projection_stack
|
||||||
+ w->projection_stack_pos * 16,
|
+ w->projection_stack_pos * 16,
|
||||||
w->modelview_stack
|
modelview_matrix);
|
||||||
+ w->modelview_stack_pos * 16);
|
|
||||||
|
|
||||||
glUniformMatrix4fv (w->mvp_matrix_uniform, 1, GL_FALSE, mvp_matrix);
|
glUniformMatrix4fv (w->mvp_matrix_uniform, 1, GL_FALSE, mvp_matrix);
|
||||||
|
glUniformMatrix4fv (w->modelview_matrix_uniform, 1, GL_FALSE,
|
||||||
|
modelview_matrix);
|
||||||
|
|
||||||
w->mvp_uptodate = GL_TRUE;
|
w->mvp_uptodate = GL_TRUE;
|
||||||
}
|
}
|
||||||
@ -536,6 +563,10 @@ cogl_wrap_glEnable (GLenum cap)
|
|||||||
glUniform1i (w->texture_2d_enabled_uniform, GL_TRUE);
|
glUniform1i (w->texture_2d_enabled_uniform, GL_TRUE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GL_FOG:
|
||||||
|
glUniform1i (w->fog_enabled_uniform, GL_TRUE);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
glEnable (cap);
|
glEnable (cap);
|
||||||
}
|
}
|
||||||
@ -552,6 +583,10 @@ cogl_wrap_glDisable (GLenum cap)
|
|||||||
glUniform1i (w->texture_2d_enabled_uniform, GL_FALSE);
|
glUniform1i (w->texture_2d_enabled_uniform, GL_FALSE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GL_FOG:
|
||||||
|
glUniform1i (w->fog_enabled_uniform, GL_FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
glDisable (cap);
|
glDisable (cap);
|
||||||
}
|
}
|
||||||
@ -654,13 +689,39 @@ cogl_wrap_glGetFixedv (GLenum pname, GLfixed *params)
|
|||||||
void
|
void
|
||||||
cogl_wrap_glFogx (GLenum pname, GLfixed param)
|
cogl_wrap_glFogx (GLenum pname, GLfixed param)
|
||||||
{
|
{
|
||||||
/* FIXME */
|
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
|
||||||
|
|
||||||
|
switch (pname)
|
||||||
|
{
|
||||||
|
case GL_FOG_MODE:
|
||||||
|
glUniform1i (w->fog_mode_uniform, param);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GL_FOG_DENSITY:
|
||||||
|
glUniform1f (w->fog_density_uniform, CLUTTER_FIXED_TO_FLOAT (param));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GL_FOG_START:
|
||||||
|
glUniform1f (w->fog_start_uniform, CLUTTER_FIXED_TO_FLOAT (param));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GL_FOG_END:
|
||||||
|
glUniform1f (w->fog_end_uniform, CLUTTER_FIXED_TO_FLOAT (param));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_wrap_glFogxv (GLenum pname, const GLfixed *params)
|
cogl_wrap_glFogxv (GLenum pname, const GLfixed *params)
|
||||||
{
|
{
|
||||||
/* FIXME */
|
_COGL_GET_GLES2_WRAPPER (w, NO_RETVAL);
|
||||||
|
|
||||||
|
if (pname == GL_FOG_COLOR)
|
||||||
|
glUniform4f (w->fog_color_uniform,
|
||||||
|
CLUTTER_FIXED_TO_FLOAT (params[0]),
|
||||||
|
CLUTTER_FIXED_TO_FLOAT (params[1]),
|
||||||
|
CLUTTER_FIXED_TO_FLOAT (params[2]),
|
||||||
|
CLUTTER_FIXED_TO_FLOAT (params[3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -44,11 +44,19 @@ struct _CoglGles2Wrapper
|
|||||||
GLuint fragment_shader;
|
GLuint fragment_shader;
|
||||||
|
|
||||||
GLint mvp_matrix_uniform;
|
GLint mvp_matrix_uniform;
|
||||||
|
GLint modelview_matrix_uniform;
|
||||||
GLint texture_matrix_uniform;
|
GLint texture_matrix_uniform;
|
||||||
GLint texture_2d_enabled_uniform;
|
GLint texture_2d_enabled_uniform;
|
||||||
GLint bound_texture_uniform;
|
GLint bound_texture_uniform;
|
||||||
GLint alpha_only_uniform;
|
GLint alpha_only_uniform;
|
||||||
|
|
||||||
|
GLint fog_enabled_uniform;
|
||||||
|
GLint fog_mode_uniform;
|
||||||
|
GLint fog_density_uniform;
|
||||||
|
GLint fog_start_uniform;
|
||||||
|
GLint fog_end_uniform;
|
||||||
|
GLint fog_color_uniform;
|
||||||
|
|
||||||
GLuint matrix_mode;
|
GLuint matrix_mode;
|
||||||
GLfloat modelview_stack[COGL_GLES2_MODELVIEW_STACK_SIZE * 16];
|
GLfloat modelview_stack[COGL_GLES2_MODELVIEW_STACK_SIZE * 16];
|
||||||
GLuint modelview_stack_pos;
|
GLuint modelview_stack_pos;
|
||||||
|
Loading…
Reference in New Issue
Block a user