Вопрос по opengl – OpenGL - рисовать пиксели на экране?

6

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

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

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

Ваш Ответ

3   ответа
10

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

2

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

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

7

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

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

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

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

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

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

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

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

Похожие вопросы