Я ищу решение для реализации альфа-маскирования с буфером трафарета в libgdx с открытыми gles 2.0.
Мне удалось реализовать простое альфа-маскирование с помощью буфера трафарета и шейдеров, где, если альфа-канал фрагмента больше некоторого указанного значения, он отбрасывается. Это прекрасно работает.
Проблема заключается в том, что когда я хочу использовать какую-либо маску градиентного изображения или расплывчатую маску png, я не получаю то, что хотел (я получаю «заполненную» прямоугольную маску без альфа-канала), вместо этого я хочу плавную маску затухания.
Я знаю, что проблема в том, что в трафаретном буфере есть только 0 и 1, но я хочу записать в трафарет некоторые другие значения, которые представляют фактическое альфа-значение фрагмента, переданного во фрагментный шейдер, и использовать это значение из трафарета каким-то образом. сделать некоторое смешивание. Я надеюсь, что объяснил, что я хочу получить, на самом деле, если это возможно.
Я недавно начал играть с OpenGL ES, поэтому у меня все еще есть некоторые недоразумения.
Мои вопросы: как настроить буфер трафарета для хранения значений, отличных от 0 и 1, и как использовать эти значения позже для альфа-маскирования?
Tnx заранее.
В настоящее время это моя установка трафарета:
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_STENCIL_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
// setup drawing to stencil buffer
Gdx.gl20.glEnable(GL20.GL_STENCIL_TEST);
Gdx.gl20.glStencilFunc(GL20.GL_ALWAYS, 0x1, 0xffffffff);
Gdx.gl20.glStencilOp(GL20.GL_REPLACE, GL20.GL_REPLACE, GL20.GL_REPLACE);
Gdx.gl20.glColorMask(false, false, false, false);
Gdx.gl20.glDepthMask(false);
spriteBatch.setShader(shaderStencilMask);
spriteBatch.begin();
// push to the batch
spriteBatch.draw(Assets.instance.actor1, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2, Assets.instance.actor1.getRegionWidth(), Assets.instance.actor1.getRegionHeight());
spriteBatch.end();
// fix stencil buffer, enable color buffer
Gdx.gl20.glColorMask(true, true, true, true);
Gdx.gl20.glDepthMask(true);
Gdx.gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_KEEP, GL20.GL_KEEP);
// draw where pattern has NOT been drawn
Gdx.gl20.glStencilFunc(GL20.GL_EQUAL, 0x1, 0xff);
decalBatch.add(decal);
decalBatch.flush();
Gdx.gl20.glDisable(GL20.GL_STENCIL_TEST);
decalBatch.add(decal2);
decalBatch.flush();