Търся решение за прилагане на алфа маскиране с шаблонен буфер в 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();