Qt - 使用QOpenGLWidget显示图像的步骤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt - 使用QOpenGLWidget显示图像的步骤相关的知识,希望对你有一定的参考价值。

我正在尝试使用QOpenGLWidget来显示一些图像,而不是使用QLabel。但我对如何做到这一点感到有点困惑。

为了使小部件完成工作,我知道我需要重新实现initializeGL()方法和paintGL()方法。

为了获得图像的纹理,我使用的是SOIL_load_image()。为什么unsigned char* img_data超过unsigned char* img_data[3]?我认为图像的每个像素都有3个值(RGB)。

获得纹理后,我不知道我应该做什么,我应该在initializeGL()paintGL()中做什么。有谁能说出这些步骤?

void MyOpenGLWidget::loadTexture(const char* file_path)
{
    *image = cv::imread(file_path, cv::IMREAD_COLOR);
    width = image->rows;
    height = image->cols;
    int channels = image->channels();
    img_data = SOIL_load_image(file_path, &width, &height, &channels, SOIL_LOAD_RGB);
}
答案

为什么unsigned char * img_data优于unsigned char * img_data [3]

unsigned char*是指向缓冲区(任意长度)数据的指针。 unsigned char* …[3]是一个包含3个数据缓冲区指针的数组。你只有一个缓冲区,而不是3个缓冲区。

出于某种原因,您使用OpenCV和SOIL两次读取相同的图像。为什么?

一旦你加载了图像,用你必须的OpenGL显示它

  1. 创建纹理对象(glGenTextures,glBindTexture,glTexImage)
  2. 通过填充顶点缓冲区对象(glGenBuffers,glBindBuffer,glBufferData)并将缓冲区中的数据与顶点数组对象的顶点属性相关联(glGenVertexArrays,glBindVertexArray),创建一些几何体来绘制它(通常是四边形或视口填充三角形) ,glEnableVertexArrayAttrib,glVertexAttribPointer)
  3. 创建一个着色器程序,由一个顶点着色器组成,该着色器放置几何体并对片段着色器进行参数化,实际上是从纹理中采样。 (glCreateShader,glShaderSource,glCreateProgram,glLinkProgram)

然后画画

  1. 选择着色器程序(glUseProgram)
  2. 设置参数(glUniform)
  3. draw(glDrawArrays)

以上是关于Qt - 使用QOpenGLWidget显示图像的步骤的主要内容,如果未能解决你的问题,请参考以下文章

添加到 QGraphicsScene 时如何更新 OpenGL 绘图(QOpenGLWidget)?

qt glsl渲染rgb

QOpenGLWidget不绘制数组

Qt音视频开发24-视频显示QOpenGLWidget方式(占用GPU)

Qt中怎么加载并显示3d模型啊?

Qt 5.5 示例,缺少 QOpenGLWidget