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

时间:2019-04-15 08:23:26

标签: qt opengl

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

1 个答案:

答案 0 :(得分:3)

  

为什么未签名的char * img_data超过未签名的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)