Использование отложенного рендеринга, получение пустого вывода

Итак, я работаю с Java/LibGDX и пытаюсь настроить самые основы отложенного рендеринга, а именно, рендеринг действующего игрового искусства в один цветовой буфер FBO и соответствующие нормали в другой цветовой буфер FBO.

(По сути, я хочу создать это и это с помощью нескольких целей рендеринга.)

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


Мой шейдер (вершина и фрагмент)

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

#version 150

in vec4 a_position;
in vec4 a_color;
in vec2 a_texCoord0;

uniform mat4 u_projTrans;

out vec4 v_color;
out vec2 v_texCoords;

void main()
{
   v_color = a_color;
   v_color.a = v_color.a * (255.0/254.0);
   v_texCoords = a_texCoord0;
   gl_Position =  u_projTrans * a_position;
}



#version 150

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif

in LOWP vec4 v_color;
in vec2 v_texCoords;

uniform sampler2D u_texture;
uniform sampler2D u_normal;

out vec4 fragColor;

void main()
{
    gl_FragData[0] = v_color * texture(u_texture, v_texCoords);
    gl_FragData[1] = texture(u_normal, v_texCoords);
}

Следующий код находится в цикле рендеринга.

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

// Position the camera.
_cameraRef.position.set(_stage.getWidth() * 0.5f, _stage.getHeight() * 0.5f, 0);

// Update the camera, SpriteBatch, and map renderer.
_cameraRef.update();
_spriteBatch.setProjectionMatrix(_cameraRef.combined);
_mapRenderer.setView(_cameraRef);       

// Bind the color texture units of the FBO (multiple-render-targets).
Gdx.gl30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, _gBufferFBOHandle);
IntBuffer intBuffer = BufferUtils.newIntBuffer(2);
intBuffer.put(GL30.GL_COLOR_ATTACHMENT0);
intBuffer.put(GL30.GL_COLOR_ATTACHMENT1);
Gdx.gl30.glDrawBuffers(2, intBuffer);

// Draw!
Gdx.gl30.glClearColor(0, 0, 0, 1);
Gdx.gl30.glClear(GL30.GL_COLOR_BUFFER_BIT);

_spriteBatch.setShader(_shaderGBuffer);
_spriteBatch.begin();

_tilesAtlasNormal.bind(1); // Using multiple texture units to draw art and normals at same time to the two color buffers of the FBO.
_tilesAtlas.bind(0);
_mapRenderer.renderTileLayer(_mapLayerBackground);

_spriteBatch.end();
_spriteBatch.setShader(null);

// Bind the default FBO.
Gdx.gl30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);

// Draw the contents of the FBO onto the screen to see what it looks like.
Gdx.gl30.glClearColor(0, 0, 0, 1);
Gdx.gl30.glClear(GL30.GL_COLOR_BUFFER_BIT);

_spriteBatch.begin();
_spriteBatch.draw(_gBufferTexture1, 0.0f, 0.0f);  // <-- This texture is blank? It's the texture that was just rendered to above.
_spriteBatch.end();

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

Просто когда я беру цветовые текстуры из этого FBO и рисую их на экране, они остаются пустыми. Я не знаю, где я иду не так.

Ценю любой вклад.

2 ответа

Не забудьте перемотать свой intbuffer:

IntBuffer intBuffer = BufferUtils.newIntBuffer(2);
intBuffer.put(GL30.GL_COLOR_ATTACHMENT0);
intBuffer.put(GL30.GL_COLOR_ATTACHMENT1);

intBuffer.rewind();

Последний раз я проверял, что gl30 не был готов к прайм-тайм в LibGDX.

Тем не менее, я достиг именно того, что вы хотите, но в gl20. Даже если у вас есть другие причины использовать gl30, возможно, вы найдете мою реализацию полезным источником видео.

Другие вопросы по тегам