Android上使用OpenGL ES 2.0的精灵不透明度

Android上使用OpenGL ES 2.0的精灵不透明度,android,opengl-es-2.0,opacity,alpha-transparency,point-sprites,Android,Opengl Es 2.0,Opacity,Alpha Transparency,Point Sprites,我试图让我的点精灵以正确的不透明度显示 最初,我在一个黑色的正方形上得到我的雪碧纹理 因此,我在片段着色器中添加了以下内容: "if(color.a < 0.5) "+ "discard;"+ “如果(颜色a

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

最初,我在一个黑色的正方形上得到我的雪碧纹理

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

"if(color.a < 0.5) "+
               "discard;"+
“如果(颜色a<0.5)”+
“丢弃;”+
现在,这似乎是可行的,因为我的精灵显示时没有黑色背景,但是,我的纹理本身是“部分透明的”——它没有显示这种部分透明,它看起来是实心的。这有点难以解释,但我希望你明白我的意思。如果我使用canvas/surfaceview绘制相同的纹理,它将正确显示

基本上,我正在尝试让我的纹理以其原始格式显示(例如,它们在创建它们的软件中所做的操作,如Gimp/photoshop等)


非常感谢您的帮助-谢谢

首先确保您的纹理是通过带有
RGBA_8888
RGBA_4444
配置的透明PNG加载的,这样您就不会丢失alpha通道

其次,您需要使用命令启用
GL\u BLEND
。在Android上,您可以这样编写:
GLES20.glEnable(GLES20.GL_BLEND)。这允许您将已绘制的颜色与新颜色混合,以实现透明外观。
对于常规透明度,混合函数应设置为:
glBlendFunc(GL\u ONE,GL\u ONE\u减去SRC\u ALPHA)
对于常规透明度:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA)

最后,您不需要使用discard,只需将
gl_FragColor
设置为第四个通道中包含alpha的4分量向量(这是从采样器读取纹理时得到的),例如,您可以只执行
gl_FragColor=texture2D(采样器,texCoord)如果你想的话

您很可能必须使用
glDisable(GL\u depth\u TEST)
关闭深度测试,以避免未排序三角形出现问题


您可以阅读更多关于透明度的内容。

谢谢@Jave,我使用了您的建议,我删除了片段着色器的丢弃部分,虽然现在没有黑盒,但它看起来仍然不正确-纹理现在是“透明”的,但周围有一个暗轮廓,图像比应该的更暗-(太透明了???)如果您有任何其他建议,我将不胜感激-谢谢我找到了答案-我需要使用GLES20.glBlendFunc(GLES20.Glu_ONE,GLES20.Glu_ONE _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _,摘自文档的示例部分,