【问题标题】:Sprite Opacity using OpenGL ES 2.0 on Android在 Android 上使用 OpenGL ES 2.0 的 Sprite 不透明度
【发布时间】:2013-03-11 13:45:24
【问题描述】:

我正在尝试让我的点精灵以正确的不透明度显示。

最初,我在一个黑色方块上获取我的精灵纹理。

所以,我在片段着色器中添加了以下内容:

"if(color.a < 0.5) "+
               "discard;"+

现在,这似乎确实有效,因为我的精灵显示没有黑色背景,但是,我的纹理本身是“部分透明的” - 它没有显示这种部分透明,它看起来是实心的。这有点难以解释,但我希望你明白我的意思。如果我使用 canvas/surfaceview 绘制相同的纹理,它会正确显示。

基本上我试图让我的纹理以其原始格式显示(即,就像它们在创建它们的软件中所做的那样 - 即 Gimp / photoshop 等)。

不胜感激 - 谢谢

【问题讨论】:

    标签: android opengl-es-2.0 opacity alpha-transparency point-sprites


    【解决方案1】:

    首先确保您的纹理是通过具有RGBA_8888RGBA_4444 配置的Bitmap 从透明png 加载的,这样您就不会丢失alpha 通道。

    其次,您需要使用glEnable() 命令启用GL_BLEND。在 Android 上,你会这样写:GLES20.glEnable(GLES20.GL_BLEND);。这使您可以将已绘制的颜色与新颜色混合,从而获得透明的外观。 混合功能应设置为 GL_ONE, GL_ONE_MINUS_ALPHA 以获得常规透明度:glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA 常规透明度:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    最后,您不需要使用丢弃,只需将 gl_FragColor 设置为 4 分量向量,其 alpha 在第四个通道中(这是您从采样器读取纹理时得到的),例如如果你愿意,你可以做gl_FragColor = texture2D(sampler, texCoord);

    您很可能必须使用 glDisable(GL_DEPTH_TEST) 关闭深度测试以避免未排序的三角形出现问题。

    您可以阅读更多关于透明度的信息here

    【讨论】:

    • 谢谢@Jave,我采纳了你的建议,我已经删除了片段着色器的丢弃部分,虽然现在没有黑框,但它看起来仍然不正确 - 纹理现在是 '透明',但它周围有一个深色轮廓,并且图像比应有的暗淡 - (太透明??)如果您有任何其他建议,将不胜感激 - 谢谢
    • 我想通了 - 我需要使用 GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);连同您的建议 - 感谢您为我指明正确的方向!
    • 不会基于 alpha 通道的透明度为 glBlendFunc(GL_APLHA, GL_ONE_MINUS_SRC_ALPHA),来自文档的示例部分,khronos.org/opengles/sdk/docs/man3/html/glBlendFunc.xhtml
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多