我试图将遮罩应用于具有透明度的纹理。我试图实现的效果是一个有裂缝的物体,你应该能够看到裂缝。我尝试使用混合和帧缓冲区但没有成功。
以下是我使用的精灵:
球:http://i.stack.imgur.com/4gImO.png
(注意球是透明的)
面具:http://i.stack.imgur.com/ij4Uw.png
(面具是白色的,中间有透明裂缝)
这是我得到的当前结果:
这是我正在寻找的结果:
(这是通过检查掩码中的每个像素使用pixmaps完成的,并且仅绘制alpha> 0的那些,但它太慢了,它在android上冻结了一两秒,我无法预加载它,因为在我需要应用蒙版之前,我不知道应用蒙版的对象。
这是我的渲染功能:
@Override
public void render() {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
mBackground.draw(batch);
batch.setBlendFunction(GL20.GL_ZERO, GL20.GL_SRC_COLOR);
mMask.draw(batch);
batch.setBlendFunction(GL20.GL_DST_ALPHA, GL20.GL_ONE_MINUS_DST_ALPHA);
mObject.draw(batch);
batch.end();
}
答案 0 :(得分:1)
我设法通过使用着色器来实现这一点。这是我的解决方案:
渲染功能:
@Override
public void render() {
Gdx.gl20.glClearColor(0, 0, 0, 1);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
mBackground.draw(batch);
batch.setShader(mShaderProgram);
Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE0);
mObjectTexture.bind(0);
mShaderProgram.setUniformi("u_texture", 0);
Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE1);
mMaskTexture.bind(1);
mShaderProgram.setUniformi("u_mask", 1);
Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE0);
batch.draw(mObjectTexture, 0, 0, 500, 500);
batch.end();
batch.setShader(null);
}
顶点着色器:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec2 v_texCoords;
void main() {
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
}
片段着色器:
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform sampler2D u_mask;
uniform mat4 u_projTrans;
void main() {
vec4 texColor = texture2D(u_texture, v_texCoords);
vec4 maskColor = texture2D(u_mask, v_texCoords);
gl_FragColor = texColor * maskColor.a;
}