我试着用GLSL做视频处理。我使用OpenCV打开一个视频文件,并将每一帧作为一幅图像,然后在GLSL着色器中使用每一帧
使用GLSL视频的最佳/理想/智能解决方案是什么?
视频阅读
VideoCapture cap("movie.MOV");
Mat image;
bool success = cap.read(image);
if(!success)
{
printf("Could not grab a frame\n\7");
exit(0);
}图像到纹理
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);什么需要在我的渲染,而循环?
我是否每次都需要重新编译/重接/重新链接我的着色器?或者,一旦我的着色器被创建和编译,我使用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();
}发布于 2014-09-17 01:06:18
让我们澄清一些需要在循环之前发生的事情,
glPixelStorei()设置像素存储模式;glGenTextures()只生成一个纹理,因为在循环的每一次迭代中,它的内容都会被新的数据所取代;glCompileShader()编译着色器,使用glCreateShader()创建着色器对象,调用glCreateProgram()创建程序,调用glAttachShader()将着色器对象附加到新程序,最后调用glLinkProgram()使一切就绪。也就是说,循环的每一次迭代都必须:
glTranslatef()的位置;glTexImage2D()将帧传送到GPU;glUseProgram()激活你的GLSL着色器;GL_QUADS或其他工具绘制二维人脸;glUseProgram(0)禁用程序;glDisable(GL_TEXTURE_YOUR_TEXTURE_TARGET)禁用纹理目标;这或多或少是需要做的。
顺便说一下,::here's my OpenCV/OpenGL/Qt application从摄像机中检索帧并显示在窗口中。不过,没有着色器。
祝好运!
发布于 2014-09-16 22:45:55
您不需要使用帧缓冲区将纹理发送到着色器。一旦将纹理0选定为活动纹理,并将0设置为着色器中统一sampler2D的值,则每次调用glBindTexture()时,它都会将sampler2D设置为函数参数中指定的纹理。因此,不,您不需要重新链接或重新编译您的着色器每次您想要改变纹理。
https://stackoverflow.com/questions/25879045
复制相似问题