首页 > 解决方案 > Qt - 使用 QOpenGLWidget 显示图像的步骤

问题描述

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

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

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

获得纹理后,我不知道我应该做什么以及我应该在initializeGL()or中在哪里做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);
}

标签: qtopengl

解决方案


为什么 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. 绘制(glDrawArrays)

推荐阅读