Qt - шаги для использования QOpenGLWidget для отображения изображений - PullRequest
3 голосов
/ 15 апреля 2019

Я пытаюсь использовать 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 Ответ

3 голосов
/ 15 апреля 2019

Почему unsigned char * img_data поверх 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. draw (glDrawArrays)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...