void gst_3d_renderer_draw_stereo (Gst3DRenderer * self, Gst3DScene * scene) { GstGLFuncs *gl = self->context->gl_vtable; _insert_gl_debug_marker (self->context, "gst_3d_renderer_draw_stereo"); /* aquire current fbo id */ GLint bound_fbo; gl->GetIntegerv (GL_DRAW_FRAMEBUFFER_BINDING, &bound_fbo); if (bound_fbo == 0) return; Gst3DCameraHmd *hmd_cam = GST_3D_CAMERA_HMD (scene->camera); /* left eye */ _draw_eye (self, self->left_fbo, scene, &hmd_cam->left_vp_matrix); /* right eye */ _draw_eye (self, self->right_fbo, scene, &hmd_cam->right_vp_matrix); gst_3d_scene_clear_state (scene); gst_3d_shader_bind (self->shader); gl->BindFramebuffer (GL_FRAMEBUFFER, bound_fbo); gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); _draw_framebuffers_on_planes (self); gst_3d_scene_clear_state (scene); }
static gboolean _2d_texture_renderer_draw (GstAmc2DTextureRenderer * renderer) { GstGLFuncs *gl; guint out_width, out_height; GLint viewport_dim[4]; /* *INDENT-OFF* */ const GLfloat vertices[] = { 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f }; /* *INDENT-ON* */ GLushort indices[] = { 0, 1, 2, 0, 2, 3 }; GLenum multipleRT[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; gl = renderer->context->gl_vtable; out_width = GST_VIDEO_INFO_WIDTH (&renderer->info); out_height = GST_VIDEO_INFO_HEIGHT (&renderer->info); gl->BindFramebuffer (GL_FRAMEBUFFER, renderer->fbo); /* attach the texture to the FBO to rendererer to */ gl->BindTexture (GL_TEXTURE_2D, renderer->tex_id); gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderer->tex_id, 0); if (gl->DrawBuffers) gl->DrawBuffers (1, multipleRT); else if (gl->DrawBuffer) gl->DrawBuffer (GL_COLOR_ATTACHMENT0); gl->GetIntegerv (GL_VIEWPORT, viewport_dim); gl->Viewport (0, 0, out_width, out_height); gl->ClearColor (0.0, 0.0, 0.0, 0.0); gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gst_gl_shader_use (renderer->shader); gst_gl_shader_set_uniform_matrix_4fv (renderer->shader, "u_transformation", 1, FALSE, renderer->transformation_matrix); gl->VertexAttribPointer (renderer->shader_attr_position_loc, 4, GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), vertices); gl->VertexAttribPointer (renderer->shader_attr_texture_loc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), &vertices[3]); gl->EnableVertexAttribArray (renderer->shader_attr_position_loc); gl->EnableVertexAttribArray (renderer->shader_attr_texture_loc); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_EXTERNAL_OES, renderer->oes_tex_id); gl->TexParameteri (GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl->TexParameteri (GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gl->TexParameteri (GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); gl->TexParameteri (GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); gl->DisableVertexAttribArray (renderer->shader_attr_position_loc); gl->DisableVertexAttribArray (renderer->shader_attr_texture_loc); if (gl->DrawBuffer) gl->DrawBuffer (GL_NONE); /* we are done with the shader */ gst_gl_context_clear_shader (renderer->context); gl->Viewport (viewport_dim[0], viewport_dim[1], viewport_dim[2], viewport_dim[3]); gst_gl_context_check_framebuffer_status (renderer->context); gl->BindFramebuffer (GL_FRAMEBUFFER, 0); return TRUE; }
static gboolean _do_convert_draw (GstGLContext * context, GstGLColorConvert * convert) { GstGLFuncs *gl; struct ConvertInfo *c_info = &convert->priv->convert_info; guint out_width, out_height; gint i; GLint viewport_dim[4]; const GLfloat vVertices[] = { 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f }; GLushort indices[] = { 0, 1, 2, 0, 2, 3 }; GLenum multipleRT[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; gl = context->gl_vtable; out_width = GST_VIDEO_INFO_WIDTH (&convert->out_info); out_height = GST_VIDEO_INFO_HEIGHT (&convert->out_info); gl->BindFramebuffer (GL_FRAMEBUFFER, convert->fbo); /* attach the texture to the FBO to renderer to */ for (i = 0; i < c_info->out_n_textures; i++) { /* needed? */ gl->BindTexture (GL_TEXTURE_2D, convert->priv->out_tex[i]->tex_id); gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, convert->priv->out_tex[i]->tex_id, 0); } if (gl->DrawBuffers) gl->DrawBuffers (c_info->out_n_textures, multipleRT); else if (gl->DrawBuffer) gl->DrawBuffer (GL_COLOR_ATTACHMENT0); gl->GetIntegerv (GL_VIEWPORT, viewport_dim); gl->Viewport (0, 0, out_width, out_height); gl->ClearColor (0.0, 0.0, 0.0, 0.0); gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gst_gl_shader_use (convert->shader); gl->VertexAttribPointer (convert->shader_attr_position_loc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), vVertices); gl->VertexAttribPointer (convert->shader_attr_texture_loc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), &vVertices[3]); gl->EnableVertexAttribArray (convert->shader_attr_position_loc); gl->EnableVertexAttribArray (convert->shader_attr_texture_loc); for (i = c_info->in_n_textures - 1; i >= 0; i--) { gchar *scale_name = g_strdup_printf ("tex_scale%u", i); gl->ActiveTexture (GL_TEXTURE0 + i); gl->BindTexture (GL_TEXTURE_2D, convert->priv->in_tex[i]->tex_id); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gst_gl_shader_set_uniform_2fv (convert->shader, scale_name, 1, convert->priv->in_tex[i]->tex_scaling); g_free (scale_name); } gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); gl->DisableVertexAttribArray (convert->shader_attr_position_loc); gl->DisableVertexAttribArray (convert->shader_attr_texture_loc); if (gl->DrawBuffer) gl->DrawBuffer (GL_NONE); /* we are done with the shader */ gst_gl_context_clear_shader (context); gl->Viewport (viewport_dim[0], viewport_dim[1], viewport_dim[2], viewport_dim[3]); gst_gl_context_check_framebuffer_status (context); gl->BindFramebuffer (GL_FRAMEBUFFER, 0); return TRUE; }