QFFPlay播放器__QOpenglWidget显示YUV

前言

本文记录用QT自带的QOpenglWidget显示YUV420p的功能。opengl的学习网站链接如下:

主页 - LearnOpenGL CN

在用opengl显示YUV之前,假设你已经在在此网站学习了以下内容:

这些是2D的相关知识。

使用QOpenGLWidget时需要实现以下三个方法:

virtual void initializeGL(); //初始化时调用
virtual void resizeGL(int w, int h);//窗口大小改变时调用
virtual void paintGL();//调用update()方法时调用

一、initializeGL()

1、初始glew库

if (!s_glew_init.test_and_set()) {
        if (glewInit() != 0) {
            s_glew_init.clear();
            qFatal("glewInit failed");
            return;
        }
    }

用glewInit()函数初始化glew库,与此同类型的库还有glad。glew库的作用是管理opengl函数指针,因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以这个任务就落在了glew库身上。

2、初始化VAO(顶点数组对象)

顶点数组对象包含顶点坐标的信息,即告诉opengl在什么位置“画图”。opengl顶点范围为-1~1,坐标原点(0,0)在窗口的中心位置

顶点数组为

GLfloat tmp[] = { //顶点数组
        -1, -1, //-1 -1 左下
         1, -1, //1 -1 右下
        -1,  1, //-1 1 左上
         1,  1, //1 1 右上
    };

纹理坐标的取值范围为0~1,左下角为坐标原点:

纹理数组为

GLfloat tmp[] = { //纹理数组
        0.0f, 1.0f,  //
        1.0f, 1.0f,
        0.0f, 0.0f,
        1.0f, 0.0f,
    };

设置VAO的属性

void HGLWidget::initVAO() {
    //设置顶点属性  告诉OpenGL该如何解析顶点数据
    glVertexAttribPointer(VER_ATTR_VER, 2, GL_FLOAT, GL_FALSE, 0, vertices);
    glEnableVertexAttribArray(VER_ATTR_VER);

    glVertexAttribPointer(VER_ATTR_TEXTURE, 2, GL_FLOAT, GL_FALSE, 0, textures);
    glEnableVertexAttribArray(VER_ATTR_TEXTURE);
}

glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据(应用到逐个顶点属性上),这里定义了两个属性VER_ATTR_VER和VER_ATTR_TEXT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值