как улучшить производительность glTexImage2D с помощью FBO - PullRequest
0 голосов
/ 02 июля 2019

Я реализовал приложение opengl-es, работающее на GPU mali-400.Я беру RGB-буфер 1280x960 с камеры и выполняю рендеринг в gpu с помощью glTexImage2D.

Однако вызов glTexImage2D занимает около 25 миллисекунд для кадра с разрешением 1280x960.Это делает дополнительную запись pCameraBuffer.

1) Есть ли способ улучшить производительность glTexImage2D?2) Поможет ли FBO?Как я могу использовать объекты Frame Buffer для рендеринга.Я нашел несколько примеров FBO, но я вижу, что эти примеры передают NULL glTexImage2d в последнем аргументе (data).так как я могу рендерить pCameraBuffer с FBO?

ниже приведен код, работающий для каждого кадра камеры.

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCENE_WIDTH, SCENE_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, pCameraBuffer);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDeleteTextures(1, &textureID);

1 Ответ

0 голосов
/ 04 июля 2019

Обычный подход к этому типу вещей - попытаться импортировать буфер камеры непосредственно в графический драйвер, избегая необходимости какого-либо выделения памяти или копирования вообще. Поддерживается ли это, во многом зависит от интеграции платформы и возможностей драйверов в системе.

Для систем Linux, которые, как вы указываете, используете, маршрут проходит через расширение EGL_EXT_image_dma_buf_import. Вам нужен драйвер камеры, который создает поверхность, поддерживаемую управляемой памятью dma_buf, и побочный канал для получения дескриптора файла dma_buf в приложение, выполняющее графические операции. Затем вы можете превратить это в EGLImage, используя расширение выше.

...