[212/906] add a glbumper (bump mapping filter through GLSL) that exposes how to use both vertex and fragment shaders

This commit is contained in:
Julien Isorce 2008-09-07 00:45:34 +02:00 committed by Tim-Philipp Müller
parent b4c0527eff
commit 0d6c956cfb
4 changed files with 52 additions and 9 deletions

View File

@ -216,7 +216,8 @@ gst_gl_display_init (GstGLDisplay *display, GstGLDisplayClass *klass)
display->ouput_texture_height = 0; display->ouput_texture_height = 0;
//action gen and del shader //action gen and del shader
display->gen_text_shader = NULL; display->gen_shader_fragment_source = NULL;
display->gen_shader_vertex_source = NULL;
display->gen_shader = NULL; display->gen_shader = NULL;
display->del_shader = NULL; display->del_shader = NULL;
@ -1566,7 +1567,7 @@ gst_gl_display_thread_use_fbo (GstGLDisplay *display)
glDrawBuffer(GL_NONE); glDrawBuffer(GL_NONE);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glPopMatrix(); glPopMatrix();
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glPopMatrix(); glPopMatrix();
@ -1606,11 +1607,28 @@ gst_gl_display_thread_gen_shader (GstGLDisplay* display)
glutSetWindow (display->glutWinId); glutSetWindow (display->glutWinId);
if (GLEW_ARB_fragment_shader) if (GLEW_ARB_fragment_shader)
{ {
gboolean isAlive = TRUE;
GError *error = NULL;
display->gen_shader = gst_gl_shader_new (); display->gen_shader = gst_gl_shader_new ();
if (!gst_gl_shader_compile_and_check (display->gen_shader, if (display->gen_shader_vertex_source)
display->gen_text_shader, gst_gl_shader_set_vertex_source(display->gen_shader, display->gen_shader_vertex_source);
GST_GL_SHADER_FRAGMENT_SOURCE))
if (display->gen_shader_fragment_source)
gst_gl_shader_set_fragment_source(display->gen_shader, display->gen_shader_fragment_source);
gst_gl_shader_compile (display->gen_shader, &error);
if (error)
{
g_warning ("%s", error->message);
g_error_free (error);
error = NULL;
gst_gl_shader_use (NULL);
isAlive = FALSE;
}
if (!isAlive)
{ {
display->isAlive = FALSE; display->isAlive = FALSE;
g_object_unref (G_OBJECT (display->gen_shader)); g_object_unref (G_OBJECT (display->gen_shader));
@ -2254,13 +2272,20 @@ gst_gl_display_del_fbo (GstGLDisplay* display, GLuint fbo,
/* Called by glfilter */ /* Called by glfilter */
void void
gst_gl_display_gen_shader (GstGLDisplay* display, const gchar* textShader, GstGLShader** shader) gst_gl_display_gen_shader (GstGLDisplay* display,
const gchar* shader_vertex_source,
const gchar* shader_fragment_source,
GstGLShader** shader)
{ {
gst_gl_display_lock (display); gst_gl_display_lock (display);
display->gen_text_shader = textShader; display->gen_shader_vertex_source = shader_vertex_source;
display->gen_shader_fragment_source = shader_fragment_source;
gst_gl_display_post_message (GST_GL_DISPLAY_ACTION_GEN_SHADER, display); gst_gl_display_post_message (GST_GL_DISPLAY_ACTION_GEN_SHADER, display);
g_cond_wait (display->cond_gen_shader, display->mutex); g_cond_wait (display->cond_gen_shader, display->mutex);
*shader = display->gen_shader; *shader = display->gen_shader;
display->gen_shader = NULL;
display->gen_shader_vertex_source = NULL;
display->gen_shader_fragment_source = NULL;
gst_gl_display_unlock (display); gst_gl_display_unlock (display);
} }

View File

@ -222,7 +222,8 @@ struct _GstGLDisplay {
GLuint ouput_texture_height; GLuint ouput_texture_height;
//action gen and del shader //action gen and del shader
const gchar* gen_text_shader; const gchar* gen_shader_fragment_source;
const gchar* gen_shader_vertex_source;
GstGLShader* gen_shader; GstGLShader* gen_shader;
GstGLShader* del_shader; GstGLShader* del_shader;
@ -300,7 +301,10 @@ gboolean gst_gl_display_use_fbo (GstGLDisplay* display, gint texture_fbo_width,
void gst_gl_display_del_fbo (GstGLDisplay* display, GLuint fbo, void gst_gl_display_del_fbo (GstGLDisplay* display, GLuint fbo,
GLuint depth_buffer); GLuint depth_buffer);
void gst_gl_display_gen_shader (GstGLDisplay* display, const gchar* textShader, GstGLShader** shader); void gst_gl_display_gen_shader (GstGLDisplay* display,
const gchar* shader_vertex_source,
const gchar* shader_fragment_source,
GstGLShader** shader);
void gst_gl_display_del_shader (GstGLDisplay* display, GstGLShader* shader); void gst_gl_display_del_shader (GstGLDisplay* display, GstGLShader* shader);
void gst_gl_display_set_window_id (GstGLDisplay* display, gulong winId); void gst_gl_display_set_window_id (GstGLDisplay* display, gulong winId);

View File

@ -490,6 +490,18 @@ gst_gl_shader_set_uniform_1i (GstGLShader * shader, const gchar * name,
glUniform1iARB (location, value); glUniform1iARB (location, value);
} }
GLint
gst_gl_shader_get_attribute_location (GstGLShader * shader, const gchar *name)
{
GstGLShaderPrivate *priv;
priv = shader->priv;
g_return_val_if_fail (priv->program_handle != 0, 0);
return glGetUniformLocationARB (priv->program_handle, name);
}
GQuark GQuark
gst_gl_shader_error_quark (void) gst_gl_shader_error_quark (void)
{ {

View File

@ -89,6 +89,8 @@ void gst_gl_shader_set_uniform_1i (GstGLShader *shader, const gchar *name, gint
void gst_gl_shader_set_uniform_1f (GstGLShader *shader, const gchar *name, gfloat value); void gst_gl_shader_set_uniform_1f (GstGLShader *shader, const gchar *name, gfloat value);
void gst_gl_shader_set_uniform_1fv (GstGLShader *shader, const gchar *name, guint count, gfloat * value); void gst_gl_shader_set_uniform_1fv (GstGLShader *shader, const gchar *name, guint count, gfloat * value);
GLint gst_gl_shader_get_attribute_location (GstGLShader *shader, const gchar *name);
G_END_DECLS G_END_DECLS
#endif /* __GST_GL_SHADER_H__ */ #endif /* __GST_GL_SHADER_H__ */