1

编辑 1:包含的着色器

编辑 2:包括屏幕截图

编辑 3:包括原始纹理的屏幕截图

编辑 4

编辑5:我认为问题是因为我的位图一开始就有部分透明的像素,所以我会问一个新问题,因为这里给出的答案对于这个问题是正确的。

仔细检查,问题似乎并没有完全解决,颜色看起来不正确。

String strFShader =
        "precision mediump float;" +
        "uniform float Opacity;" +
        "varying vec2 v_texCoords;" +
        "uniform sampler2D u_baseMap;" +
        "void main()" +
        "{" +
        "gl_FragColor = texture2D(u_baseMap, v_texCoords);" +
        "gl_FragColor.a *= Opacity;"+            
        "}";

然后在我的渲染方法中:

    //Enable and set mode
    GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

//Draw
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

//Disable
GLES20.glDisable(GLES20.GL_BLEND);

因此,在最大透明度 (0.0) 时,一切都很好,即没有绘制任何内容。但是在任何其他级别都不太正确,例如,在零透明度(不透明度设置为 1.0)时,这就是我得到的:

![在此处输入图像描述][1]

但它实际上应该是这样的:

![在此处输入图像描述][2]

颜色看起来有点太暗了,(在原始图像上),曾经如此微暗的边缘真的很明显。

我假设这与混合模式有关?基本上我只是在改变一层的不透明度时可能会在Photoshop中获得效果。任何其他建议都会非常有帮助。

我也尝试了这里找到的解决方案:

https://gamedev.stackexchange.com/questions/7260/opengl-es-basic-fragment-shader-help-with-transparency

但我得到相同的结果?

谢谢 :-)

4

1 回答 1

4

首先,将您的更改glBlendFuncglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

不透明度渲染由着色器程序处理,该程序在调用glBlendFunc. 更具体地说,这是由绑定程序的片段着色器的 gl_FragColor 输出的 alpha 分量指定的。下面的片段着色器显示了一个非常简单的示例,说明如何利用着色器程序来完成淡入淡出效果。

precision mediump float;
uniform float Opacity; // range 0.0 to 1.0
varying vec2 v_texCoords;
uniform sampler2D u_baseMap;

void main(void)
{
    gl_FragColor = texture2D(u_baseMap, v_texCoords) ;
    gl_FragColor.a *= Opacity;
}

您将前景层的当前不透明度绑定到着色器程序 uniform 的位置Opacity。在您的情况下,由于您希望前景层淡入,您只需在操作之间选择时间步长多次执行完整的绘制操作(背景层然后前景层)以实现平滑淡入淡出。

另外:请记住在绘制前景对象后每次都禁用混合状态。在 OpenGL 中,一旦操作完成,将值重置为之前的状态始终是一种很好的做法。忘记这样做会导致一些严重的头痛。

于 2013-03-29T08:23:10.920 回答