首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将视频(帧)输入到GLSL着色器

如何将视频(帧)输入到GLSL着色器
EN

Stack Overflow用户
提问于 2014-09-16 21:54:56
回答 2查看 4.1K关注 0票数 2

我试着用GLSL做视频处理。我使用OpenCV打开一个视频文件,并将每一帧作为一幅图像,然后在GLSL着色器中使用每一帧

使用GLSL视频的最佳/理想/智能解决方案是什么?

视频阅读

代码语言:javascript
复制
VideoCapture cap("movie.MOV");
Mat image;
bool success = cap.read(image);
if(!success)
{
    printf("Could not grab a frame\n\7");
    exit(0);
}

图像到纹理

代码语言:javascript
复制
 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),我能继续发送新的纹理吗?

我用来向屏幕呈现纹理的当前循环如下所示。我怎样才能调整这个来处理视频呢?我需要在哪里进行调用来更新在着色器中使用的纹理?

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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从摄像机中检索帧并显示在窗口中。不过,没有着色器。

祝好运!

票数 3
EN

Stack Overflow用户

发布于 2014-09-16 22:45:55

您不需要使用帧缓冲区将纹理发送到着色器。一旦将纹理0选定为活动纹理,并将0设置为着色器中统一sampler2D的值,则每次调用glBindTexture()时,它都会将sampler2D设置为函数参数中指定的纹理。因此,不,您不需要重新链接或重新编译您的着色器每次您想要改变纹理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25879045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档