static void gst_gl_effects_xray_step_three (gint width, gint height, guint texture, gpointer data) { GstGLEffects *effects = GST_GL_EFFECTS (data); GstGLShader *shader; shader = g_hash_table_lookup (effects->shaderstable, "xray2"); if (!shader) { shader = gst_gl_shader_new (); g_hash_table_insert (effects->shaderstable, "xray2", shader); } g_return_if_fail (gst_gl_shader_compile_and_check (shader, vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gst_gl_shader_use (shader); glActiveTexture (GL_TEXTURE1); glEnable (GL_TEXTURE_RECTANGLE_ARB); glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture); glDisable (GL_TEXTURE_RECTANGLE_ARB); gst_gl_shader_set_uniform_1i (shader, "tex", 1); gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel); gst_gl_effects_draw_texture (effects, texture); }
static void gst_gl_differencematte_vblur (gint width, gint height, guint texture, gpointer stuff) { GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff); gfloat gauss_kernel[9] = { 0.026995f, 0.064759f, 0.120985f, 0.176033f, 0.199471f, 0.176033f, 0.120985f, 0.064759f, 0.026995f }; glMatrixMode (GL_PROJECTION); glLoadIdentity (); gst_gl_shader_use (differencematte->shader[2]); glActiveTexture (GL_TEXTURE0); glEnable (GL_TEXTURE_RECTANGLE_ARB); glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture); glDisable (GL_TEXTURE_RECTANGLE_ARB); gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0); gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 9, gauss_kernel); gst_gl_shader_set_uniform_1f (differencematte->shader[2], "norm_const", 0.977016f); gst_gl_shader_set_uniform_1f (differencematte->shader[2], "norm_offset", 0.0f); gst_gl_differencematte_draw_texture (differencematte, texture); }
static void gst_gl_effects_xray_step_two (gint width, gint height, guint texture, gpointer data) { GstGLShader *shader; GstGLEffects *effects = GST_GL_EFFECTS (data); GstGLFilter *filter = GST_GL_FILTER (effects); GstGLContext *context = filter->context; GstGLFuncs *gl = context->gl_vtable; shader = g_hash_table_lookup (effects->shaderstable, "xray1"); if (!shader) { shader = gst_gl_shader_new (context); g_hash_table_insert (effects->shaderstable, "xray1", shader); } if (!kernel_ready) { fill_gaussian_kernel (gauss_kernel, 7, 1.5); kernel_ready = TRUE; } if (!gst_gl_shader_compile_and_check (shader, hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)) { gst_gl_context_set_error (context, "Failed to initialize hconv7 shader"); GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, ("%s", gst_gl_context_get_error ()), (NULL)); return; } gl->MatrixMode (GL_PROJECTION); gl->LoadIdentity (); gst_gl_shader_use (shader); gl->ActiveTexture (GL_TEXTURE1); gl->Enable (GL_TEXTURE_2D); gl->BindTexture (GL_TEXTURE_2D, texture); gl->Disable (GL_TEXTURE_2D); gst_gl_shader_set_uniform_1i (shader, "tex", 1); gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel); gst_gl_shader_set_uniform_1f (shader, "width", width); gst_gl_filter_draw_texture (filter, texture, width, height); }
static void gst_gl_effects_xray_step_two (gint width, gint height, guint texture, gpointer data) { GstGLEffects *effects = GST_GL_EFFECTS (data); GstGLShader *shader; shader = g_hash_table_lookup (effects->shaderstable, "xray1"); if (!shader) { shader = gst_gl_shader_new (); g_hash_table_insert (effects->shaderstable, "xray1", shader); } if (!kernel_ready) { fill_gaussian_kernel (gauss_kernel, 7, 1.5); kernel_ready = TRUE; } if (!gst_gl_shader_compile_and_check (shader, hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)) { gst_gl_display_set_error (GST_GL_FILTER (effects)->display, "Failed to initialize hconv7 shader"); GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, GST_GL_DISPLAY_ERR_MSG (GST_GL_FILTER (effects)->display), (NULL)); return; } glMatrixMode (GL_PROJECTION); glLoadIdentity (); gst_gl_shader_use (shader); glActiveTexture (GL_TEXTURE1); glEnable (GL_TEXTURE_RECTANGLE_ARB); glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture); glDisable (GL_TEXTURE_RECTANGLE_ARB); gst_gl_shader_set_uniform_1i (shader, "tex", 1); gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel); gst_gl_effects_draw_texture (effects, texture); }
static void gst_gl_differencematte_vblur (gint width, gint height, guint texture, gpointer stuff) { GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff); GstGLFilter *filter = GST_GL_FILTER (stuff); GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; gst_gl_shader_use (differencematte->shader[2]); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_2D, texture); gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0); gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 7, differencematte->kernel); gst_gl_shader_set_uniform_1f (differencematte->shader[2], "gauss_height", height); gst_gl_filter_draw_texture (filter, texture, width, height); }
static void gst_gl_filterblur_vcallback (gint width, gint height, guint texture, gpointer stuff) { GstGLFilter *filter = GST_GL_FILTER (stuff); GstGLFilterBlur *filterblur = GST_GL_FILTERBLUR (filter); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gst_gl_shader_use (filterblur->shader1); glActiveTexture (GL_TEXTURE1); glEnable (GL_TEXTURE_RECTANGLE_ARB); glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture); glDisable (GL_TEXTURE_RECTANGLE_ARB); gst_gl_shader_set_uniform_1i (filterblur->shader1, "tex", 1); gst_gl_shader_set_uniform_1fv (filterblur->shader1, "kernel", 7, filterblur->gauss_kernel); gst_gl_filter_draw_texture (filter, texture); }
int gst_gl_shadervariable_set (GstGLShader * shader, struct gst_gl_shadervariable_desc *ret) { switch (ret->type) { case _bool: if (ret->arraysize) { gst_gl_shader_set_uniform_1iv (shader, ret->name, ret->count, (int *) ret->value); } else { gst_gl_shader_set_uniform_1i (shader, ret->name, ((int *) ret->value)[0]); } break; case _int: if (ret->arraysize) { gst_gl_shader_set_uniform_1iv (shader, ret->name, ret->count, (int *) ret->value); } else { gst_gl_shader_set_uniform_1i (shader, ret->name, ((int *) ret->value)[0]); } break; case _uint: if (ret->arraysize) { gst_gl_shader_set_uniform_1iv (shader, ret->name, ret->count, (int *) ret->value); } else { gst_gl_shader_set_uniform_1i (shader, ret->name, ((unsigned int *) ret->value)[0]); } break; case _float: if (ret->arraysize) { gst_gl_shader_set_uniform_1fv (shader, ret->name, ret->count, (float *) ret->value); } else { gst_gl_shader_set_uniform_1f (shader, ret->name, ((float *) ret->value)[0]); } break; case _vec2: if (ret->arraysize) { gst_gl_shader_set_uniform_2fv (shader, ret->name, ret->count, (float *) ret->value); } else { gst_gl_shader_set_uniform_2f (shader, ret->name, ((float *) ret->value)[0], ((float *) ret->value)[1]); } break; case _bvec2: case _ivec2: case _uvec2: if (ret->arraysize) { gst_gl_shader_set_uniform_2iv (shader, ret->name, ret->count, (int *) ret->value); } else { gst_gl_shader_set_uniform_2i (shader, ret->name, ((int *) ret->value)[0], ((int *) ret->value)[1]); } break; case _vec3: if (ret->arraysize) { gst_gl_shader_set_uniform_3fv (shader, ret->name, ret->count, (float *) ret->value); } else { gst_gl_shader_set_uniform_3f (shader, ret->name, ((float *) ret->value)[0], ((float *) ret->value)[1], ((float *) ret->value)[2]); } break; case _bvec3: case _ivec3: case _uvec3: if (ret->arraysize) { gst_gl_shader_set_uniform_3iv (shader, ret->name, ret->count, (int *) ret->value); } else { gst_gl_shader_set_uniform_3i (shader, ret->name, ((int *) ret->value)[0], ((int *) ret->value)[1], ((int *) ret->value)[2]); } break; case _vec4: if (ret->arraysize) { gst_gl_shader_set_uniform_4fv (shader, ret->name, ret->count, (float *) ret->value); } else { gst_gl_shader_set_uniform_4f (shader, ret->name, ((float *) ret->value)[0], ((float *) ret->value)[1], ((float *) ret->value)[2], ((float *) ret->value)[3]); } break; case _bvec4: case _ivec4: case _uvec4: if (ret->arraysize) { gst_gl_shader_set_uniform_4iv (shader, ret->name, ret->count, (int *) ret->value); } else { gst_gl_shader_set_uniform_4i (shader, ret->name, ((int *) ret->value)[0], ((int *) ret->value)[1], ((int *) ret->value)[2], ((int *) ret->value)[3]); } break; case _mat2: case _mat2x2: gst_gl_shader_set_uniform_matrix_2fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; case _mat3: case _mat3x3: gst_gl_shader_set_uniform_matrix_3fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; case _mat4: case _mat4x4: gst_gl_shader_set_uniform_matrix_4fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; #if GST_GL_HAVE_OPENGL case _mat2x3: gst_gl_shader_set_uniform_matrix_2x3fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; case _mat3x2: gst_gl_shader_set_uniform_matrix_3x2fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; case _mat2x4: gst_gl_shader_set_uniform_matrix_2x4fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; case _mat4x2: gst_gl_shader_set_uniform_matrix_4x2fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; case _mat3x4: gst_gl_shader_set_uniform_matrix_3x4fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; case _mat4x3: gst_gl_shader_set_uniform_matrix_4x3fv (shader, ret->name, ret->count, 0, (float *) ret->value); break; #endif default: return -1; } return 0; }