Как выполнить рендеринг в FBO после прямого рендеринга в текстуру, не затрагивая текстуру

Я пытаюсь повторно использовать FBO, который ранее использовал для прямого рендеринга в текстуру.

Я хочу выполнить рендеринг в этом FBO, не затрагивая текстуру, и захватить пиксели с помощью glReadPixels.

Обычно я бы рендерил что угодно и получал пиксели с помощью glReadPixels, и это работает, но это влияет на мою предыдущую текстуру. По этой причине я пытаюсь отделить текстуру от FBO, используя glFramebufferTexture2D с дескриптором текстуры равным 0. После этого glReadPixels возвращает только черный экран, почему?

CODE:

Gdx.gl20.glBindFramebuffer(GL20.GL_FRAMEBUFFER, getFBOHandle());                    
Gdx.gl20.glFramebufferRenderbuffer(GL20.GL_FRAMEBUFFER, GL20.GL_DEPTH_ATTACHMENT, GL20.GL_RENDERBUFFER, getDBOHandle());

//detach texture previously used, if I dont detach, glReadPixels works, but overwrites the texture
Gdx.gl20.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_COLOR_ATTACHMENT0, GL20.GL_TEXTURE_2D, 0, 0);  

int status = Gdx.gl20.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
if (status != GL20.GL_FRAMEBUFFER_COMPLETE) System.out.println("FBO ATTACHMENT INCOMPLETE");

Gdx.gl20.glViewport(0, 0, 2048, 1500);


//CLEAR SCREEN USING SPECIFIC COLOR TO SEE WHAT HAS BEEN REDRAWN
Gdx.gl20.glClearColor(0.5f, 1, 1, 1);
Gdx.gl20.glClear( GL20.GL_DEPTH_BUFFER_BIT | GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl20.glFlush();

...

glReadPixels follows

...

Я хотел бы правильно отсоединить предыдущую текстуру, отрендерить что-то в этом FBO и захватить пиксели, а затем снова использовать FBO для прямого рендеринга в текстуру (восстановить предыдущее состояние).

Как мне этого добиться?

  • Я не хочу создавать еще один FBO из-за ограниченности ресурсов
  • работа с Opengl ES2

person Jayco    schedule 03.05.2014    source источник
comment
glFrameBufferTexture2d ничего НЕ отсоединяет, но прикрепляет текстуру в качестве цели (цвет, глубина ...) для текущего связанного буфера кадра.   -  person Trax    schedule 03.05.2014
comment
Как мне тогда отсоединить его и предотвратить перезапись? Спасибо   -  person Jayco    schedule 03.05.2014
comment
@Jakob: FBO нужно что-то для рендеринга; Сами по себе FBO не имеют холста, на котором можно было бы рисовать. Поэтому после отмены привязки исходной текстуры привяжите другую текстуру в качестве прикрепления нового цвета.   -  person datenwolf    schedule 03.05.2014


Ответы (1)


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

http://www.opengl.org/wiki/Framebuffer_Object#Empty_framebuffers

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

person Bellian    schedule 03.05.2014