write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
新浪微博
--
讨论新闻组
--
代码库
--
豆瓣
第二次使用别人的引擎碰到用OpenGL线性过滤算法放大图片出现黑边的问题了,而引擎的制作者竟然不知道怎么解决,两次碰到此问题时都是试图教导我使用最近点过滤方式绕行,我很无奈,帮助其解决一下,顺面将问题简单的记录于此。
OpenGL在放大图片时有两种方法,一种是最近点(NEAREST),一种是线性(LINEAR),虽然在OpenGL里面,设置纹理参数的时候都称为过滤(filter),都通过glTexParameteri函数设置。比如二维时,设置线性过滤:
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
放大时实际算法为插值(
interpolation)。
具体的
最近点过滤算法参考
,
线性过滤算法参考
。
简单的讲,最近点过滤算法就是用最靠近像素中心的那个纹理单元进行放大和缩小,效率更高,效果不好,锯齿严重。
线性过滤算法是对靠近像素中心的2*2纹理单元(二维时,三维为2*2*2),取加权平均值,用于放大和缩小。效果更好,效率稍低。(参看《OpenGL编程指南》第六版)
一般来说,我们常用Linear方式,但是Linear方式有个问题,那就是碰到边缘时怎么处理的问题,一种是取边缘外元素作为普通点进行加权计算,一种是不取。
为了方便演示,我使用一张Android SDK中附带的图片,并放大2.0f倍,多次紧密排列绘制,以观察效果,主要绘制源代码如下:
void DrawImage(float x, float y, float scale) {
glBegin(GL_QUADS);
glTexCoord2f(0.0 , 0.0 ); glVertex3f(x, y, 0.0f);
glTexCoord2f(1.0 , 0.0 ); glVertex3f(x + (gImg.Width * scale), y, 0.0f);
glTexCoord2f(1.0 , 1.0 ); glVertex3f(x + (gImg.Width * scale), y + (gImg.Height * scale), 0.0f);
glTexCoord2f(0.0 , 1.0 ); glVertex3f(x, y + (gImg.Height * scale), 0.0f);
glEnd();
}
void DrawImages(float x, float y) {
DrawImage(x, y, 2.0f);
DrawImage(x + gImg.Width * 2.0f, y, 2.0f);
DrawImage(x, y + gImg.Height * 2.0f, 2.0f);
DrawImage(x + gImg.Width * 2.0f, y + gImg.Height * 2.0f, 2.0f);
}
当然,这里我主要关心linear方式,所以:
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR );
在默认时,OpenGL
是默认设置GL_REPEAT的
,此时,加权的纹理单元是从原纹理单元的相反一侧去取。效果的好坏依赖与图片的内容。
绘制4张图片时感觉效果还行:
但是仅绘制上面两张图片时,效果明显有问题,可以看到下面有明显的白边(加权计算来自于上面白色的状态栏)
在OpenGL中,还有几种情况
1.GL_CLAMP,线性算法会取边框外的像素点进行计算,导致黑边,这也就是常见的黑边效果。
2.
GL_CLAMP_TO_EDGE,忽略边框,为简单设置时想要的正确效果。
3.GL_CLAMP_TO_BORDER,添加边框颜色值,在纹理坐标超出边框时,按设定的颜色值进行计算,在没有为边框设置值时,效果类似GL_CLAMP。(可以将此时的边框值看做为黑色)
比如,我用如下方法,设置一个红色边框值,
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
float color[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
glTexParameterfv( GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color);
效果就会如下,明显多出一个红色边框:
加入还觉得不够明显的话,修改draw函数,
void DrawImage(float x, float y, float scale) {
glBegin(GL_QUADS);
glTexCoord2f(-0.1 , -0.1 ); glVertex3f(x, y, 0.0f);
glTexCoord2f(1.1 , -0.1 ); glVertex3f(x + (gImg.Width * scale), y, 0.0f);
glTexCoord2f(1.1 , 1.1 ); glVertex3f(x + (gImg.Width * scale), y + (gImg.Height * scale), 0.0f);
glTexCoord2f(-0.1 , 1.1 ); glVertex3f(x, y + (gImg.Height * scale), 0.0f);
glEnd();
}
这下意思明显了吧:
以上是OpenGL的情况,OpenGL ES的情况又需要单独讲一下:
OpenGL ES 1.1中,只有两种情况,REPEAT(默认),和
GL_CLAMP_TO_EDGE。
参考这里
。
Android的情况,在我手机(Nexus S)中,默认的Repeat方式,会看到黑边。(这个有点奇怪,与OpenGL中的现象不一样)设置为
GL_CLAMP_TO_EDGE后,问题解决。
iphone上的情况,望知情人通知,目前没有时间测试。
原创文章作者保留版权 转载请注明原作者 并给出链接
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
分享到:
相关推荐
Web2.0技术探源PPT 信息服务的作为 Web2.0与数字图书馆/语义Web Web结构 编码语言的发展 数字图书馆微观结构:KWF Microformat微格式 本体的一种实现:主题图(Topic Maps) Web 2.0技术特征 AJAX Web2.0的核心竞争力
人际和谐的伦理探源论文
重阳节习俗探源.doc
阿赖耶识探源韩廷杰
介紹說明,Web2.0技術探源SimSun技術恐懼思想的可怕並不僅在於它似乎在現實中有某種基礎,而更為可怕的是這種思想所營造的陳規與成見形成的對問題看法的壁壘。
【标题】83中华文明探源.pptx 中华文明探源主要涵盖了人类步入文明时代的标志,以及中华文明在黄河、长江流域的起源与发展。文明的诞生通常与以下几个要素紧密相关:阶级分化、国家(城市)的出现以及文字的发明。...
西南少数民族手工造纸技术探源.doc
《计算之书》中的“elchataym”算法是求解线性问题精确解的一种一般性算法,作者斐波那契指出此算法源于阿拉伯,除此没有更多关于其来源的叙述。通过对早期阿拉伯数学家萨马瓦尔《代数珍宝》阿拉伯文献的解读,将他所述...
“中华文明探源工程”新进展.docx
唐太宗“华夷如一”思想探源.doc
"中华文明探源工程"是一项旨在揭示中国五千年文明起源与早期发展的重大科研项目。该项目通过考古调查和多学科交叉研究,对黄河、长江、西辽河流域等地的文明化进程进行了深入探讨,证实了中华文明在距今5300年前后...
《中华姓氏探源》这篇文档探讨了中国姓氏文化的深厚历史和演变过程。中国的姓氏不仅是个人身份的标识,更是研究中国古代社会结构、宗法制度和传统文化的重要线索。 姓氏的起源可以追溯到原始社会的母系氏族时代,...
本项目名为"应用层抓包嗅探源代码",它提供了一种在应用层进行数据包捕获和分析的能力,这对于开发、调试和维护网络应用非常有价值。以下是关于这个项目的详细知识点: 1. **网络抓包基础**:网络抓包是通过监听...
人工智能技术异化及其本质探源 人工智能技术的快速发展正在对社会产生深远的影响。在它所带来的便利和进步背后,也伴随着一系列的负面效应,包括可能导致的失业、贫富差距扩大、算法歧视、以及人的主体性危机等问题...
五年级下册传统文化成语探源PPT学习教案.pptx
高中历史之历史百科魏晋时期思想文化成就探源素材
殷商甲骨文与乐学探源是中华文明起源研究中的一个重要课题。甲骨文作为我国古代文字的早期形态,不仅记录了商朝晚期社会、政治、经济、文化等各方面的信息,也承载了丰富的乐学内容,为我们研究古代音乐文化提供了...
### 医院HIS信息系统的软件建设探源 #### 医院信息化的现状与挑战 随着信息技术的迅速发展,医院信息化已经成为提升医疗服务质量和效率的重要手段。然而,在推进医院信息化的过程中,国内多数医院仍然面临着诸多...
### 人工智能技术异化及其本质探源 #### 人工智能技术异化现象 人工智能(AI)技术自其诞生之日起就伴随着双刃剑的特性,既对社会进步和人类发展起到了推动作用,也带来了诸多负面效应。在社会的诸多领域,如机器人...