前言
本文记录用QT自带的QOpenglWidget显示YUV420p的功能。opengl的学习网站链接如下:
在用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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



