use immutable storage for video frame texture

This commit is contained in:
frank 2021-07-03 19:31:29 -04:00
parent af5b438f7e
commit 5e5a2b1e48
1 changed files with 9 additions and 13 deletions

View File

@ -92,8 +92,12 @@ void Pudding::load_gl_context()
glBindAttribLocation(world_program, 0, "in_Position"); glBindAttribLocation(world_program, 0, "in_Position");
glBindAttribLocation(world_program, 1, "vertexUV"); glBindAttribLocation(world_program, 1, "vertexUV");
link_shader(world_program); link_shader(world_program);
/* generate the texture that will store the video frame */ /* generate the texture that will store the video frame, allocate storage for a video frame, bind and edit texture properties */
glGenTextures(1, &video_capture_texture_id); glGenTextures(1, &video_capture_texture_id);
glBindTexture(GL_TEXTURE_2D, video_capture_texture_id);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, capture.get(cv::CAP_PROP_FRAME_WIDTH), capture.get(cv::CAP_PROP_FRAME_HEIGHT));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
log_gl_errors(); log_gl_errors();
} }
@ -399,7 +403,7 @@ std::shared_ptr<SDL_Texture> Pudding::texture_from_image_url(const std::string&
*/ */
void Pudding::destroy_texture(SDL_Texture* texture) void Pudding::destroy_texture(SDL_Texture* texture)
{ {
// not sure why SDL_Log works here but SDL_LogDebug and SDL_LogInfo don't /* not sure why SDL_Log works here but SDL_LogDebug and SDL_LogInfo don't */
SDL_Log("destroying texture %p", texture); SDL_Log("destroying texture %p", texture);
SDL_DestroyTexture(texture); SDL_DestroyTexture(texture);
} }
@ -443,24 +447,16 @@ void Pudding::update()
capture.read(capture_frame); capture.read(capture_frame);
if (!capture_frame.empty()) if (!capture_frame.empty())
{ {
/* convert opencv matrix to sdl texture */
// SDL_Texture* texture = SDL_CreateTexture(
// get_renderer(), SDL_PIXELFORMAT_BGR24, SDL_TEXTUREACCESS_STATIC, capture_frame.cols, capture_frame.rows);
// SDL_UpdateTexture(texture, nullptr, static_cast<void*>(capture_frame.data), capture_frame.step1());
// SDL_RenderCopyF(get_renderer(), texture, nullptr, &video_box);
// SDL_DestroyTexture(texture);
glUseProgram(world_program);
/* rotate the opencv matrix 180 to work with opengl coords */ /* rotate the opencv matrix 180 to work with opengl coords */
cv::flip(capture_frame, capture_frame, -1); cv::flip(capture_frame, capture_frame, -1);
glUseProgram(world_program);
/* bind texture to GLSL sampler */ /* bind texture to GLSL sampler */
glBindTexture(GL_TEXTURE_2D, video_capture_texture_id);
GLint base_texture_location = glGetUniformLocation(world_program, "baseTexture"); GLint base_texture_location = glGetUniformLocation(world_program, "baseTexture");
glUniform1i(base_texture_location, 0); glUniform1i(base_texture_location, 0);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, video_capture_texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
/* convert opencv matrix to GL texture */ /* convert opencv matrix to GL texture */
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, capture_frame.cols, capture_frame.rows, 0, GL_BGR, GL_UNSIGNED_BYTE, capture_frame.ptr()); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, capture_frame.cols, capture_frame.rows, GL_BGR, GL_UNSIGNED_BYTE, capture_frame.ptr());
glDrawArrays(GL_TRIANGLES, 0, 6); glDrawArrays(GL_TRIANGLES, 0, 6);
SDL_GL_SwapWindow(get_window()); SDL_GL_SwapWindow(get_window());
log_gl_errors(); log_gl_errors();