На 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 прост в использовании и работает достаточно хорошо для многих целей.