OpenGL ES 2.0圆形纹理在混合时具有可见轮廓

时间:2018-06-17 15:35:52

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

启用混合

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);

Shader是

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);

抗锯齿:4x

EGL10.EGL_SAMPLE_BUFFERS, 1,
EGL10.EGL_SAMPLES, 4

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

enter image description here

输出:纹理具有可见轮廓

Output

1 个答案:

答案 0 :(得分:0)

你的纹理不是完全白色 - 它是黑色背景上的白色圆圈。白色纹素有1.0 alpha,黑色纹素有0.0 alpha。

现在启用边缘周围的线性滤波并获得在黑白纹素之间插值的纹理像素样本,并且您将获得在颜色通道中稍微灰色且在Alpha通道中部分透明的内容。

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

如果你将颜色值全部设置为白色,并且只有一个零或非零的alpha,它将表现得像你期望的那样。