如何使用opengl显示RGB24视频帧

时间:2013-10-14 14:25:53

标签: opengl rendering rgb rgba

我的任务是使用openGL's 过剩库渲染一组50个RGB帧。

我试过了:在3D立方体旋转中,我有一组顶点,使用它们将它渲染到窗口。但是,在渲染RGB帧的情况下应该做什么?下面是我使用它渲染我的3D立方体的代码:

#include <glut.h>

GLfloat vertices[24]={-1.0,-1.0,-1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,1.0,1.0,1.0,1.0,-1.0,1.0,1.0};
GLfloat colors[24]={-1.0,-1.0,-1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,1.0,1.0,1.0,1.0,-1.0,1.0,1.0};
GLubyte cubeIndices[24]={0,3,2,1,2,3,7,6,0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4};
static GLfloat theta[3]={0,0,0};
static GLint axis=2;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glRotatef(theta[0],1.0,0.0,0.0);
    glRotatef(theta[1],0.0,1.0,0.0);
    glRotatef(theta[2],0.0,0.0,1.0);

    glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,cubeIndices);

    glutSwapBuffers();
    glFlush();
}

void spinCude()
{
    theta[axis]+=2.0;
    if(theta[axis]>360.0)
        theta[axis]-=360.0;
    display();
}
void init()
{
    glMatrixMode(GL_PROJECTION);
    glOrtho(-2.0,2.0,-2.0,2.0,-10.0,10.0);
    glMatrixMode(GL_MODELVIEW);
}

void mouse(int btn,int state, int x,int y)
{
    if(btn==GLUT_LEFT_BUTTON&& state==GLUT_DOWN) axis=0;
    if(btn==GLUT_MIDDLE_BUTTON&& state==GLUT_DOWN) axis=1;
    if(btn==GLUT_RIGHT_BUTTON&& state==GLUT_DOWN) axis=2;
}

void main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

    glutInitWindowSize(500,500);
    glutCreateWindow("Simple YUV Player");
    init();
    glutDisplayFunc(display);

    glutIdleFunc(spinCude);
    glutMouseFunc(mouse);
    glEnable(GL_DEPTH_TEST);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3,GL_FLOAT,0,vertices);

    //glEnableClientState(GL_COLOR_ARRAY);
    glVertexPointer(3,GL_FLOAT,0,colors);

    glutMainLoop();

}

任何人都可以建议我一些示例或教程,以便我可以修改上面的代码来显示RGB帧。

2 个答案:

答案 0 :(得分:2)

一旦你将RGB-Frame作为原始数据存储在内存中,事情就非常简单了。使用glGenTextures创建纹理,使用glBindTexture绑定它,然后通过glTexImage2DglTexSubImage2D上传数据。然后使用该纹理渲染全屏四边形或任何您喜欢的内容。这样做的好处是,您可以通过渲染具有相同纹理的多个四边形来渲染场景中的多个“虚拟”电视,想象一下电视商店,其中相同的视频在十几台电视上运行。 glDrawPixels也可能有用,但功能却少得多。

我不知道是否可以通过纹理上传(VLC等硬件加速电影播放程序最有可能做得更先进),但这应该是一个好的开始。

答案 1 :(得分:0)

正如Marius已经建议的那样,首先实现纹理映射。对于纹理映射教程来说,这是相当困难的。

使用OpenGL渲染帧并不是最好的,你应尽量避免使用它们,因为它可能涉及客户端 - &gt;主机内存副本,这真的很省钱(需要太多时间)或者只是占用太多内存。无论如何,如果你真的必须这样做,只需要生成尽可能多的纹理,glGenTextures通过glTexImage2D加载纹理,然后在每个框架中用一个简单的循环翻转框架。

P.S。根据您的应用程序名称“YUV Player”判断,您可能还需要转换输入数据,因为OpenGL主要使用RGB而不是YUV。