在Android上使用OpenGL ES 2.0的Sprite Opacity

Zip*_*ppy 2 android opacity alpha-transparency point-sprites opengl-es-2.0

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

最初,我在黑色方块上得到了我的精灵纹理.

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

"if(color.a < 0.5) "+
               "discard;"+
Run Code Online (Sandbox Code Playgroud)

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

基本上我正在尝试让我的纹理以原始格式显示(即他们在创建它们的软件中进行显示 - 即Gimp/photoshop等).

非常感谢任何帮助 - 谢谢

Jav*_*ave 6

首先确保你的纹理是由透明的PNG图像通过装载Bitmap有两种RGBA_8888RGBA_4444配置,这样你就不会失去alpha通道.

其次,您需要GL_BLEND使用glEnable()命令启用.在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);

最后,您不需要使用discard,只需将gl_FragColor第四个通道中的alpha 设置为4分量向量(这是从采样器读取纹理时获得的),例如,gl_FragColor = texture2D(sampler, texCoord);如果您愿意,可以执行此操作.

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

您可以在这里阅读更多关于透明度的内容.