我正在尝试使用 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 显示它,您必须
- 创建纹理对象(glGenTextures、glBindTexture、glTexImage)
- 通过填充顶点缓冲区对象(glGenBuffers、glBindBuffer、glBufferData)并将缓冲区中的数据与顶点数组对象( glGenVertexArrays, glBindVertexArray, glEnableVertexArrayAttrib, glVertexAttribPointer)
- 创建一个着色器程序,包括放置几何体的顶点着色器和参数化实际上从纹理采样的片段着色器。 (glCreateShader, glShaderSource, glCreateProgram, glLinkProgram)
然后画画
- 选择着色器程序(glUseProgram)
- 设置参数(glUniform)
- 绘制 (glDrawArrays)
关于Qt - 使用 QOpenGLWidget 显示图像的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55685128/