如何将遮罩应用于具有透明度的纹理以实现透视效果

时间:2015-08-11 21:39:52

标签: opengl opengl-es libgdx

我试图将遮罩应用于具有透明度的纹理。我试图实现的效果是一个有裂缝的物体,你应该能够看到裂缝。我尝试使用混合和帧缓冲区但没有成功。

以下是我使用的精灵:
球:http://i.stack.imgur.com/4gImO.png
(注意球是透明的)
面具:http://i.stack.imgur.com/ij4Uw.png
(面具是白色的,中间有透明裂缝)

这是我得到的当前结果:
enter image description here
这是我正在寻找的结果: enter image description here
(这是通过检查掩码中的每个像素使用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();
}

1 个答案:

答案 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;
}