qt opengl渲染yuv的代码
时间: 2023-01-11 19:55:36 浏览: 89
好的,下面是一个用 Qt 和 OpenGL 渲染 YUV 视频帧的示例代码:
```
#include <QtGui>
#include <QtOpenGL>
class YUVFrame : public QGLWidget
{
public:
YUVFrame(QWidget *parent = 0) : QGLWidget(parent) {}
~YUVFrame() {}
void setYUVData(uchar *yuvData, int width, int height)
{
m_yuvData = yuvData;
m_width = width;
m_height = height;
update();
}
protected:
void initializeGL()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
}
void resizeGL(int width, int height)
{
glViewport(0, 0, width, height);
}
void paintGL()
{
if (!m_yuvData)
return;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
// 绑定 YUV 纹理
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_textureIds[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, m_width, m_height, 0, GL_RED, GL_UNSIGNED_BYTE, m_yuvData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_textureIds[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, m_width / 2, m_height / 2, 0, GL_RED, GL_UNSIGNED_BYTE, m_yuvData + m_width * m_height);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, m_textureIds[2]);
glTexImage