【发布时间】:2014-07-18 08:14:26
【问题描述】:
我正在寻找一种解决方案,通过 open gles 2.0 在 libgdx 中使用模板缓冲区实现 alpha 屏蔽。
我已经设法使用模板缓冲区和着色器实现简单的 alpha 掩码,如果片段的 alpha 通道大于某个指定值,它就会被丢弃。效果很好。
问题是当我想使用一些渐变图像蒙版或绑定 png 蒙版时,我没有得到我想要的(我得到没有 alpha 通道的“填充”矩形蒙版),而是我想要平滑淡出蒙版.
我知道问题是在模板缓冲区中只有 0 和 1,但我想写入模板一些其他值,这些值表示在片段着色器中传递的片段的实际 alpha 值,并使用该值来自模板以某种方式进行一些混合。 我希望我已经解释了我想要得到的东西,如果可能的话。
我最近开始玩OpenGL ES,所以还是有一些误解。
我的问题是:如何设置和模板缓冲区来存储除 0 和 1 以外的值,以及如何在以后使用这些值进行 alpha 屏蔽?
提前发送。
这是我目前的模板设置:
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();
【问题讨论】:
-
Stenciling 不允许部分 alpha 值。为了获得介于两者之间的值,我认为您必须将您的东西绘制到 FrameBuffer 中,然后使用 FrameBuffer 的颜色纹理和表示 alpha 的纹理通过多重纹理绘制到屏幕上。但根据您的具体需求,可能会有更简单的解决方案。
-
我试图掩盖 3d 平面,例如一个平面代表面具,另一个平面在面具平面后面。我希望在面罩的纹理透明的地方变得透明。我目前在 Libgdx 中使用贴花。如果没有 fps 下降,这是否可能?
-
平面是指 3D 空间中的矩形?如果两个矩形的大小、方向和位置完全相同,那么您可以使用多纹理来实现,尽管这需要对贴花进行一些变通。
-
是的,平面基本上是 3D 空间中的矩形。面具应该是静态的,面具后面的平面可以移动。并且重叠部分应该被屏蔽。
-
我只能想到涉及FrameBuffers的方法。是否影响 FPS 取决于你的瓶颈是什么。
标签: libgdx opengl-es-2.0 stencil-buffer