在OpenGL ES 2.0中改变不透明度

时间:2013-03-28 22:06:56

标签: android opengl-es-2.0 opacity sprite

编辑1 :包含的着色器

编辑2 :包含的屏幕截图

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

编辑4

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

仔细观察后,问题似乎无法解决,颜色看起来不正确。

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

但我得到的结果相同?

谢谢: - )

1 个答案:

答案 0 :(得分:4)

首先,将您的glBlendFunc更改为glBlendFunc(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总是将一个值重置为之前的状态。忘记这样做会引起一些严重的麻烦。