我的任务是使用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帧。
答案 0 :(得分:2)
一旦你将RGB-Frame作为原始数据存储在内存中,事情就非常简单了。使用glGenTextures
创建纹理,使用glBindTexture
绑定它,然后通过glTexImage2D
或glTexSubImage2D
上传数据。然后使用该纹理渲染全屏四边形或任何您喜欢的内容。这样做的好处是,您可以通过渲染具有相同纹理的多个四边形来渲染场景中的多个“虚拟”电视,想象一下电视商店,其中相同的视频在十几台电视上运行。
glDrawPixels
也可能有用,但功能却少得多。
我不知道是否可以通过纹理上传(VLC等硬件加速电影播放程序最有可能做得更先进),但这应该是一个好的开始。
答案 1 :(得分:0)
正如Marius已经建议的那样,首先实现纹理映射。对于纹理映射教程来说,这是相当困难的。
使用OpenGL渲染帧并不是最好的,你应尽量避免使用它们,因为它可能涉及客户端 - &gt;主机内存副本,这真的很省钱(需要太多时间)或者只是占用太多内存。无论如何,如果你真的必须这样做,只需要生成尽可能多的纹理,glGenTextures通过glTexImage2D加载纹理,然后在每个框架中用一个简单的循环翻转框架。
P.S。根据您的应用程序名称“YUV Player”判断,您可能还需要转换输入数据,因为OpenGL主要使用RGB而不是YUV。