glDrawBuffers в opengl es 2.0 c ++ - PullRequest
       1

glDrawBuffers в opengl es 2.0 c ++

0 голосов
/ 22 февраля 2019

Я портирую код из Windows на Android, и в Opengl ES 2.0 не существует нескольких методов GL.

Цель состоит в том, чтобы отобразить все в текстуру, которая будет отображаться с использованием определенного шейдера для эффектов..

Первая строка:

Версия для Windows

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);

Версия ES 2.0?Я не уверен

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0, 0);

вторая строка:

версия windows

GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, DrawBuffers);

версия ES 2.0?

отсутствует

код:

glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

glGenTextures(1, &renderedTexture);

glBindTexture(GL_TEXTURE_2D, renderedTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);

GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, DrawBuffers);

РЕДАКТИРОВАТЬ:

после настройки приложение запускается, но оно аварийно завершает работу и logcat говорит:

D/libGLESv2: DTS_GLAPI : DTS is not allowed for Package : xxx.xxx 

и утверждение:

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)

верно

текущий код:

glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

glGenTextures(1, &renderedTexture);

glBindTexture(GL_TEXTURE_2D, renderedTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0, 0);

1 Ответ

0 голосов
/ 22 февраля 2019

Вместо glFramebufferTexture в (на рабочем столе) OpenGL, его можно использовать glFramebufferTexture2D в OpenGL ES 2.0.
3-й параметр glFramebufferTexture2D - этотекстурная цель, которая в вашем случае составляет GL_TEXTURE_2D:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_2D, renderedTexture, 0); 

Перенос вызова на glDrawBuffers не требуется, поскольку в исходном состоянии буфер отрисовки для нулевого цвета фрагмента равен COLOR_ATTACHMENT0, а в OpenGL ES 2.0 единственное возможное вложение цвета -COLOR_ATTACHMENT0.
В OpenGL ES 3.0 это поведение меняется и аналогично используемой версии OpenGL (для настольных компьютеров).

Далее, чтобы соответствовать правилам полноты кадрового буфера, внутренний формат прикрепленного изображения должен иметь формат Renderable .

Для получения подробной информации см. Полная спецификация OpenGL ES 2.0 - 4.4.5 Полнота фреймбуфера (стр. 117/118).

Сказана цель объекта фреймбуферабыть полным кадровым буфером, если он является кадровым буфером, предоставленным оконной системой, или если выполняются все следующие условия:

[...]

  • Сочетание внутренних форматовприкрепленные изображения не нарушают зависящий от реализации набор ограничений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...