【问题标题】:OpenglES 2.0 PNG alpha texture overlapOpenglES 2.0 PNG alpha纹理重叠
【发布时间】:2012-07-29 16:41:45
【问题描述】:

我正在尝试在屏幕上绘制多个具有 Alpha 通道的六边形。图片是这样的:

所以,我将纹理加载到程序中,没关系。运行时,alpha 通道与背景颜色混合,这没关系,但是当两个六边形相互重叠时,重叠部分成为背景颜色!图片下方:

当然,这不是我所期望的效果。我希望它们重叠而不会将背景绘制在其他纹理上。这是我的绘图代码:

    GLES20.glUseProgram(Program);

    hVertex  = GLES20.glGetAttribLocation(Program,"vPosition");
    hColor   = GLES20.glGetUniformLocation(Program, "vColor");
    uTexture = GLES20.glGetUniformLocation(Program, "u_Texture");
    hTexture = GLES20.glGetAttribLocation(Program, "a_TexCoordinate");
    hMatrix  = GLES20.glGetUniformLocation(Program, "uMVPMatrix");

    GLES20.glVertexAttribPointer(hVertex, 3, GLES20.GL_FLOAT, false, 0, bVertex);
    GLES20.glEnableVertexAttribArray(hVertex);
    GLES20.glUniform4fv(hColor, 1, Color, 0);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, hTexture);
    GLES20.glUniform1i(uTexture, 0);
    GLES20.glVertexAttribPointer(hTexture, 2, GLES20.GL_FLOAT, false, 0, bTexture);
    GLES20.glEnableVertexAttribArray(hTexture);

    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
    GLES20.glEnable(GLES20.GL_BLEND);

    x=-1;y=0;z=0;
    for (int i=0;i<10;i++) {
        Matrix.setIdentityM(ModelMatrix, 0);
        Matrix.translateM(ModelMatrix, 0, x, y, z);
        x+=0.6f;
        Matrix.multiplyMM(ModelMatrix, 0, ModelMatrix, 0, ProjectionMatrix, 0);
        GLES20.glUniformMatrix4fv(hMatrix, 1, false, ModelMatrix, 0);
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, DrawOrder.length, GLES20.GL_UNSIGNED_SHORT, bDrawOrder);
    }

    GLES20.glDisable(GLES20.GL_BLEND);
    GLES20.glDisableVertexAttribArray(hVertex);
}

还有我的片段着色器:

public final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "uniform sampler2D u_Texture;" +
        "varying vec2 v_TexCoordinate;" +
        "void main() {" +
        "  gl_FragColor = vColor * texture2D(u_Texture, v_TexCoordinate);" +
        "}";

和我的渲染器代码:

    super(context);
    setEGLContextClientVersion(2);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);
    setEGLConfigChooser(8, 8, 8, 8, 8, 8);
    renderer = new GLRenderer(context);
    setRenderer(renderer);

我已经尝试在 glBlendFunc 上使用不同的功能,但似乎没有任何效果。有谁知道问题出在哪里?我真的迷路了。如果需要更多代码,请询问!

谢谢!

【问题讨论】:

  • 你有没有启用深度测试?
  • 是的,我愿意。我在 onSurfaceCreated 函数上启用它。我在想这个问题已经在混合,但改变混合类型没有效果,纹理仍然在这个奇怪的 alpha 中重叠。

标签: android opengl-es textures alpha overlap


【解决方案1】:

我的猜测是您在绘制这些时需要禁用深度测试。由于它们都出现在相同的深度,因此当您绘制最左边的环时,它会写入四边形中每个像素的深度缓冲区,甚至是透明像素。

然后,当您在右侧绘制下一个四边形时,重叠的像素不会被绘制,因为它们未通过深度测试,因此您只会得到一个与第一个四边形相交的空白区域。

【讨论】:

  • 效果很好!我永远猜不到……谢谢! =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多