2

我想让我的点精灵显示正确的不透明度。在Android上使用OpenGL ES 2.0的雪碧不透明度

最初,我在一个黑色的正方形上得到了我的精灵纹理。

所以,我增加了以下我的片段着色器:

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

现在,这似乎工作,在我的精灵显示没有黑色的背景,但是,我的质地本身是“部分透明” - 并没有表现出这种局部透明度,它显得坚实。这有点难以解释,但我希望你明白我的意思。如果我使用canvas/surfaceview绘制相同的纹理,它将正确显示。

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

希望得到任何帮助 - 感谢

回答

6

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

其次,您需要启用GL_BLENDglEnable()命令。在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分矢量与阿尔法在第四个通道中(这是从采样器读取纹理时得到的),例如如果你愿意,你可以做gl_FragColor = texture2D(sampler, texCoord);

您将很可能不得不关闭深度测试glDisable(GL_DEPTH_TEST)以避免未分类三角形的问题。

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

+0

谢谢@Jave,我用你的建议,我已经删除了碎片着色器的丢弃部分,虽然现在没有黑盒,但它看起来不正确 - 纹理现在是'透明',但有它周围的黑色轮廓和图像是比它应该更沉闷 - (太透明??)将不胜感激,如果您有任何其他建议 - 谢谢 – Zippy 2013-03-22 12:55:31

+1

我想通了 - 我需要使用GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);连同你的建议 - 谢谢你指出我在正确的方向! – Zippy 2013-03-22 13:44:41

+0

是的,我忘了这一步,但更新了我的答案:) – Jave 2013-03-22 14:18:07