2

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

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

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

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

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

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

将不胜感激任何帮助 - 谢谢

4

1 回答 1

6

首先确保你的纹理是从透明的 png 中通过BitmapwithRGBA_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);

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

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

您可以在此处阅读有关透明度的更多信息。

于 2013-03-21T21:16:11.510 回答