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 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _,摘自文档的示例部分,