【问题标题】:Changing level of opacity in OpenGL ES 2.0更改 OpenGL ES 2.0 中的不透明度级别
【发布时间】:2013-03-19 13:12:59
【问题描述】:

编辑 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

但我得到相同的结果?

谢谢:-)

【问题讨论】:

    标签: android opengl-es-2.0 opacity sprite


    【解决方案1】:

    首先,将您的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;
    }
    

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

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

    【讨论】:

    • 非常感谢。我已经编辑了我的问题以包括我的着色器。请您展示我如何将其实现到我的着色器中。由于我正在使用纹理,我仍然不是 100% 清楚 - 谢谢!
    • 再次感谢您的持续帮助,我添加了一些屏幕截图来显示执行此操作时会发生什么 - 知道我哪里出错了吗?再次感谢
    • 尝试将您的 glBlendFunc 更改为 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    • 在不透明度值设置为 0.0 的情况下稍微好一点,但如果我增加值,它就像预期的那样完全不可见。它使所有东西都消失了(包括脸部周围的黑框),几乎就在那里!
    • 查看我上面的编辑。您的u_baseMap 采样器必须绑定到 RGBA 纹理才能使其工作。即你的笑脸纹理必须将黑色区域定义为具有 0 或接近 0 的 alpha。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2015-12-18
    相关资源
    最近更新 更多