Opencv 如何将视频(帧)输入GLSL着色器
我正在尝试使用GLSL进行视频处理。我使用OpenCV打开一个视频文件,并将每个帧作为单个图像,然后我想在GLSL着色器中使用每个帧 使用GLSL视频的最佳/理想/智能解决方案是什么 从视频中阅读 图像到纹理 我的渲染while循环中需要什么? 是否每次都需要重新编译/重新连接/重新链接着色器?或者,一旦我的着色器被创建和编译并且我使用了Opencv 如何将视频(帧)输入GLSL着色器,opencv,opengl,glsl,video-processing,Opencv,Opengl,Glsl,Video Processing,我正在尝试使用GLSL进行视频处理。我使用OpenCV打开一个视频文件,并将每个帧作为单个图像,然后我想在GLSL着色器中使用每个帧 使用GLSL视频的最佳/理想/智能解决方案是什么 从视频中阅读 图像到纹理 我的渲染while循环中需要什么? 是否每次都需要重新编译/重新连接/重新链接着色器?或者,一旦我的着色器被创建和编译并且我使用了glUseProgram(shaderProgram)我可以继续发送新的纹理吗 我用来在屏幕上渲染纹理的当前循环如下所示。我怎样才能使其适应视频工作?我需要在哪
glUseProgram(shaderProgram)
我可以继续发送新的纹理吗
我用来在屏幕上渲染纹理的当前循环如下所示。我怎样才能使其适应视频工作?我需要在哪里调用以更新着色器中使用的纹理
while(!glfwWindowShouldClose(window))
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0,0,512,512);
glBindFramebuffer(GL_READ_FRAMEBUFFER, frameBuffer);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, image.cols, image.rows, 0, 0, image.cols, image.rows, GL_COLOR_BUFFER_BIT, GL_LINEAR);
glfwSwapBuffers(window);
glfwPollEvents();
}
不需要使用帧缓冲区将纹理发送到着色器。一旦将纹理0选择为活动纹理,并将0设置为着色器中统一采样器2D的值,每次调用
glBindTexture()
,它都会将采样器2D设置为在函数参数中指定的任何纹理。因此,不需要每次更改纹理时都重新链接或重新编译着色器。让我们澄清一些在循环之前需要发生的事情:
- 使用
设置像素存储模式李>glPixelStorei()
- 使用
只生成一个纹理,因为在循环的每次迭代中,其内容都将被新数据替换李>glGenTextures()
- 使用
编译着色器,使用glCompileShader()
创建着色器对象,调用glCreateShader()
创建程序,调用glCreateProgram()
将着色器对象附加到新程序,最后调用glAttachShader()
准备就绪李>glLinkProgram()
- 清除颜色和深度缓冲区李>
- 使用标识矩阵加载modelview矩阵李>
- 指定要绘制图形的位置
李>glTranslatef()
- 从视频中检索新帧李>
- 启用相应的纹理目标,绑定它,然后使用
将帧传输到GPU李>glTexImage2D()
- 调用
以激活GLSL着色器李>glUseProgram()
- 使用
或其他工具绘制二维面李>GL_四边形
- 使用
禁用程序李>glUseProgram(0)
- 使用
禁用纹理目标李>glDisable(GL_texture\u YOUR_texture\u target)
- 调用
祝你好运 IplImages是过去的爆炸。使用cv::Mat和cv::VideoCaptureOk,我将其更新为使用cv::Mat.downvote。请对捕获执行相同的操作。你的帖子将永远保留SO@karlphillip我刚刚开始了这个网页,这是一个正在进行的工作,但是感谢您的输入:)哦,这就是我在示例代码中使用帧缓冲区对象的原因。因为我实际上是同时处理两个视频流。我需要从着色器中取出两帧。因此,我使用了
COLOR\u ATTACHMENT0
和COLOR\u ATTACHMENT1
您始终可以同时绑定两个纹理,一个使用纹理槽0,一个使用纹理槽1,然后在着色器中有两个sampler2D
s。感谢您概述了非常容易遵循的步骤
GLuint tex;
glGenTextures(1, tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.cols, image.rows, 0,
GL_BGR, GL_UNSIGNED_BYTE, image.data);
glUniform1i(glGetUniformLocation(shaderProgram, "Texture"), 0);
while(!glfwWindowShouldClose(window))
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0,0,512,512);
glBindFramebuffer(GL_READ_FRAMEBUFFER, frameBuffer);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, image.cols, image.rows, 0, 0, image.cols, image.rows, GL_COLOR_BUFFER_BIT, GL_LINEAR);
glfwSwapBuffers(window);
glfwPollEvents();
}