1

我的任务是使用openGL's glut库渲染一组 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 帧。

4

2 回答 2

2

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

我不知道通过纹理上传是否可行(硬件加速电影播放程序如 VLC 很可能会做一些更高级的事情),但这应该是一个好的开始。

于 2013-10-14T14:47:11.473 回答
0

正如 Marius 已经建议的那样,首先实现纹理映射。任何纹理映射教程都可以做到这一点。

使用 OpenGL 渲染帧并不是最好的,您应该尽量避免使用它们,因为它可能涉及客户端 -> 主机内存副本,这非常昂贵(花费太多时间)或者只是占用了太多内存。无论如何,如果你真的必须这样做,只需使用 glGenTextures 生成尽可能多的纹理,通过 glTexImage2D 将纹理加载到它们中,然后在每一帧中用一个简单的循环翻转帧。

PS 从您的应用程序名称“YUV Player”来看,您可能还需要转换输入数据,因为 OpenGL 主要使用 RGB 而不是 YUV。

于 2013-10-14T18:51:13.520 回答