На OpenGL рисовать пиксели на экране?

Я хочу нарисовать 2D-массив пиксельных данных (RGB / оттенки серого) на экране как можно быстрее, используя OpenGL. Пиксельные данные часто меняются.

Я надеялся, что найду простую функцию, которая позволит мне ввести указатель на массив, представляющий пиксельные данные, поскольку это, вероятно, самый быстрый подход. К сожалению, я не нашел такой функции.

каков наилучший способ выполнить эту задачу?

3 ответов


может быть glDrawPixels - это функция, которую вы ищете? Хотя, если данные статичны, было бы лучше создать текстуру с ним, а затем нарисовать каждый кадр.


недавно у меня была аналогичная проблема, так как я пытаюсь отобразить видео на экран (т. е. повторно загружать пиксельные данные в VRAM), мой подход:

  • используйте glTexImage2D и glTexSubImage2D для загрузки данных в текстуру (т. е. свяжите текстуру (и блок текстуры, если применимо) перед вызовом этого)

  • в моем случае, поскольку частота кадров видео (обычно около 24 кадров в секунду) ниже, чем частота кадров моего приложения (нацеленная на 60 кадров в секунду), чтобы избегайте загрузки тех же данных снова я использую объект framebuffer (проверьте glGenFramebuffers/glBindFramebuffer/glDeleteFramebuffers) и свяжите мою текстуру с framebuffer (glFramebufferTexture2D). Затем я загружаю эту текстуру один раз и рисую один и тот же кадр несколько раз (просто обычный доступ к текстуре с помощью glBindTexture)

  • Я не знаю, какую платформу вы используете, но поскольку я нацелен на Mac, я использую некоторые расширения Apple, чтобы обеспечить передачу данных в VRAM через DMA (т. е. сделать glTexSubImage2D немедленно вернуться, чтобы позволить процессору делать другую работу) - пожалуйста, не стесняйтесь спрашивать меня о дополнительной информации, если вы используете Mac тоже

  • также, как вы используете только оттенки серого, вы можете рассмотреть возможность просто использовать текстуру GL_LUMINANCE (т. е. 1 байт на пиксель), а не формат на основе RGB, чтобы сделать загрузку быстрее (но это зависит от размера ваших текстурных данных, я транслировал HD 1920x1080 видео, поэтому мне нужно было убедиться, чтобы сохранить его вниз)

  • также имейте в виду формат, который использует ваше оборудование, чтобы избежать ненужных преобразований данных (т. е. обычно лучше использовать данные BGRA, чем, например, только RGB)

  • наконец, в моем коде Я заменил все фиксированные функции конвейера шейдерами (в частности, преобразование данных из оттенков серого или формата YUV в RGB), но опять же все это зависит от размера ваших данных и рабочей нагрузки вашего процессора или GPU

надеюсь, что это поможет, не стесняйтесь сообщать мне, если вам нужна дополнительная информация


Я думаю, что самый быстрый способ будет сделать экран размером квада с проекцией орто и использовать пиксельный шейдер и Объект Буфера Текстуры для рисования непосредственно к текстуре в пиксельном шейдере. Из-за задержки передачи в/из TBO вы можете увидеть, поможет ли двойная буферизация.

Если скорость не очень беспокоит (вам просто нужны довольно интерактивные частоты кадров), glDrawPixels прост в использовании и работает достаточно хорошо для многих целей.