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

4

我想使用 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);
}

你已经阅读了文档吗?请参见https://doc.qt.io/qt-5/qopenglwidget.html#details - Max
1个回答

4
为什么要使用unsigned char* img_data,而不是unsigned char* img_data[3]? unsigned char* 是一个指向数据缓冲区(任意长度)的指针。unsigned char* …[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)

是的,你说得对。但我不确定是否需要处理RGB值,比如我是否需要将img_data分离为new_img_data[0]、new_img_data[1]和new_im_data[2]。但看起来我不需要这样做。 - SpellTheif
@Jinx:不需要创建平面图像(将图像分成单独的红色、绿色和蓝色单色层)。你应该将原始数据缓冲区传递给OpenGL,并告诉OpenGL数据以什么格式到达。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接