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

标签 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);
}

最佳答案

Why is unsigned char* img_data over 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)

关于Qt - 使用 QOpenGLWidget 显示图像的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55685128/

相关文章:

qt - Sailfish OS - 接受对话框后更改页面

c++ - Qt:如何将 GUI 元素的集合放入独立的子类中(使用单独的 *.ui 文件)

c++ - 在 QGraphicsView 上锁定 View

opengl - OpenGL 纹理坐标是否必须在 0-1 范围内

c++ - 如何在 Mac OSX 上使用 distutils 编译带有 python C++ 扩展的 OpenGL?

c++ - 最快的 python/C++ 多媒体库

c++ - 如何将屏幕外渲染到 Linux 上的图像?

c++ - 通过 QDirectPainter 绘画

c++ - 从文件中读取 GLSL 着色器

c - 使用 glfw 和 vsync 时桌面感觉迟钝