use immutable storage for video frame texture
This commit is contained in:
parent
af5b438f7e
commit
5e5a2b1e48
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue