qt - 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);
}
解决方案
为什么 unsigned char* img_data 优于 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)
推荐阅读
- excel - 如果突出显示另一个单元格,则 VBA 突出显示单元格
- django - 自定义模板不覆盖 PasswordResetConfirmView 的模板
- laravel - Laravel-7 pdf验证规则不起作用
- python - Tkinter Entry() 不从输入中获取数字
- docker - 您可以将来自 docker 的单独构建组合起来吗?
- java - 导入包 net.jodah.typetools,不安全的类型/方法不起作用(假设是因为 java 版本不匹配)
- c - 为什么 n 必须是正数
- javascript - axios拦截器从Vue.js中调用Promise中窃取catch()路径,破坏下游错误处理
- java - 如何让 SimpleDateFormat 给我像 13/6/2021 这样的数字?
- python - if 语句与 Python 中的 match/case 语句有何不同?