Android Opengl ES物体边缘出现暗色像素

3
我想让您注意以下图片。
首先是原始图片。
然后是在屏幕上的渲染效果。
如您所见,原始图片中所有都是漂亮的黄色,边缘有些透明度以显得更加平滑。但是当我进行渲染时,会出现一些变暗的像素点。
为了避免我通常得到的答案,我使用了:
gl.glTexImage2D(GL10.GL_TEXTURE_2D, level, GL10.GL_RGBA, width, height, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer);

而不是glutil工具

此外

gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

有人有解决方法吗?

谢谢。

Jason


编辑

我做了一些调查。在原始图像中,我的背景颜色已经与硬币的颜色相同,并且我使用了一个alpha掩码。我也检查过,当我加载位图时,似乎所有alpha为0的位图都会自动设置为0,0,0,0。这可能是问题所在。


编辑

实际上,这似乎是个问题。我检查了我打开的位图的值,透明像素的值为0,0,0,0,而不是我设置的颜色。这是位图的问题还是我创建图像的问题?

// Load up, and flip the texture:
            Bitmap temp = BitmapFactory.decodeResource(context.getResources(), resource, opts);
            Bitmap bmp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(), temp.getHeight(), flip, true);
            temp.recycle();
2个回答

2
你的图片背景色是什么?也就是说,当你移除alpha通道后它看起来像什么?我猜是黑色?尝试将背景颜色设置为与你的徽标相同的颜色(即黄色),然后再试一次。
编辑:根据评论,我们可以修改答案。即使你正确地设置了周围像素的RGB颜色,某些图像压缩格式可能仍然会“优化”掉所有完全透明的像素,并将其转换为(0,0,0,0),这将在使用双线性过滤时导致你描述的问题。尝试使用不同的文件格式,或者进行研究以查看是否可以在特定的压缩中关闭此功能,或者考虑在加载后在代码中修复图像。

我进行了一些调查。在原始图像中,我的背景已经与硬币的颜色相同,并且我使用了 alpha 掩模。我还检查了一下,当我加载位图时,似乎所有 alpha 值为 0 的位图都会自动设置为 0,0,0,0。这可能是问题所在。 - Jason Rogers
1
你的文件是什么格式?这可能是压缩的一部分 - 所有完全透明的像素都被视为0,0,0,0,因为双线性过滤的问题通常在进行图像压缩时不是一个问题。 - EboMike

1

你的图像可能具有预乘alpha值。尝试使用gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);

有关更多详细信息,请参见此帖子


如果我使用gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);,我不再得到平滑的边缘,反而得到了一个看起来更糟糕的楼梯效果:D。但是感谢提供的链接,我会去查看一下。 - Jason Rogers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接