对象边缘的Android Opengl ES暗像素
Posted
技术标签:
【中文标题】对象边缘的Android Opengl ES暗像素【英文标题】:Android Opengl ES dark pixels on edge of objects 【发布时间】:2010-11-30 05:23:27 【问题描述】:我想提请您注意以下图片
首先是原图
然后它是如何在屏幕上呈现的
正如你在原版上看到的那样,一切都很好,呈黄色,边缘有轻微的透明度,看起来很光滑。
但是当我渲染时,会出现一些变暗的像素。
为了避免我得到通常的答案
我用
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);
有人有解决方案吗?
谢谢
杰森
编辑
我做了一些挖掘工作。在原始图像中,我的背景已经与硬币颜色相同,并且我使用了 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();
【问题讨论】:
【参考方案1】:图片的背景颜色是什么?即当您移除 Alpha 通道时会是什么样子?我猜 - 它是黑色的?尝试将背景颜色设置为与您的徽标相同的颜色(即淡黄色),然后重试。
编辑:也可以根据 cmets 编辑答案。即使您正确设置了周围像素的 RGB 颜色,某些图像压缩格式仍可能会“优化”它并将所有完全透明的像素变为(0,0,0,0),这将导致您在使用时描述的问题双线性滤波。尝试使用不同的文件格式,或者研究一下是否可以在特定压缩中关闭此功能,或者考虑在加载后在代码中修复图像。
【讨论】:
我做了一些挖掘工作。在原始图像中,我的背景已经与硬币颜色相同,并且我使用了 alpha 蒙版。我还检查过,当我加载位图时,似乎所有具有 alpha 0 的位图都自动设置为 0,0,0,0。这可能是问题所在。 你的文件是什么格式的?可能是压缩的一部分 - 所有完全透明的像素都被视为 0,0,0,0,因为在进行图像压缩时,双线性过滤的问题通常不是问题。【参考方案2】:您的图像可能具有预乘的 alpha 值。尝试使用gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
更多详情请见this post。
【讨论】:
如果我使用 gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);我不再得到光滑的边缘,我得到的楼梯效果看起来更糟:D。但是感谢您的链接,我会检查一下以上是关于对象边缘的Android Opengl ES暗像素的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL ES之深入解析PBOUBO与TBO的功能和使用
IOS OpenGL ES GPUImage 图像 XYDerivative 边缘检测 GPUImageXYDerivativeFilter