【问题标题】:OpenGL ES 2.0 circle texture has visible outline when blending [duplicate]混合时OpenGL ES 2.0圆形纹理具有可见轮廓[重复]
【发布时间】:2018-06-17 15:35:52
【问题描述】:

启用混合

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

纹理加载为

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texture, 0);

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

着色器是

private static final String VERTEX_SHADER_CODE =
        "uniform mat4 uMVPMatrix;" +
                "attribute vec4 vPosition;" +
                "attribute vec2 aTexCoord;" +
                "varying vec2 vTexCoord;" +
                "void main() {" +
                "  gl_Position = uMVPMatrix * vPosition;" +
                "  vTexCoord = aTexCoord;" +
                "}";

private static final String FRAGMENT_SHADER_CODE =
        "precision mediump float;" +
                "varying vec2 vTexCoord;" +
                "uniform sampler2D sTexture;" +
                "void main() {" +
                "  gl_FragColor = texture2D(sTexture, vTexCoord);" +
                "}";

清晰的颜色:

GLES20.glClearColor(1f, 1f, 1f, 1f);

抗锯齿:4 倍

EGL10.EGL_SAMPLE_BUFFERS, 1,
EGL10.EGL_SAMPLES, 4

纹理(白色透明背景的白色圆圈):

输出:纹理有可见的轮廓

【问题讨论】:

    标签: android opengl-es opengl-es-2.0 blending texturing


    【解决方案1】:

    您的纹理并非全白 - 它是黑色背景上的白色圆圈。白色纹素的 alpha 为 1.0,黑色纹素的 alpha 为 0.0。

    现在启用边缘周围的线性过滤,并获得一个在黑色和白色纹素之间插值的纹素样本,你会得到在颜色通道中有点灰色,在 Alpha 通道中部分透明的东西。

    基本上只需记住 OpenGL 和 OpenGL ES 使用后乘 alpha 混合,颜色通道非常重要,即使对于 alpha 值为零的纹素也是如此......

    如果您将颜色值全部设置为白色,并且只有一个零或非零 alpha,它的行为将与您预期的一样。

    【讨论】:

    • 谢谢。我尝试生成具有0x00ffffff 背景和0xffffffff 圆圈的纹理,但它没有给我想要的结果。此外,我的背景可以动态变化,甚至可以设置另一个纹理。我无法动态选择半透明像素应具有的颜色。
    • 我已经绘制了另一个纹理为 png,这一次透明背景是白色的。修改了有问题的纹理。输出没有改变。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多