当前位置: 移动技术网 > 网络运营>网络>协议 > opengl纹理缩放的原理

opengl纹理缩放的原理

2020年07月15日  | 移动技术网网络运营  | 我要评论

一、背景

用OpenGL处理3dlut映射的时候,lut滤镜数据输入到纹理后,不经过任何处理直接输出,图像两边会有错误的像素点出现,如下(更换了图片,以便验证结果的一般性)
在这里插入图片描述如上图,在边缘出现了模糊的颜色

二、原因

在我的测试demo中有以下代码设置纹理的属性

// 当纹理坐标超出范围时,重复当前纹理
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);	
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);	
// 纹理放大和缩小均使用线性化插值
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

然后我生成了一个只有四个像素的图片,将其输入到OpenGL,放大到400*400,然后输出,原图和输出结果如下
在这里插入图片描述
原因已经渐渐清晰了,再看下图
在这里插入图片描述如上图所示,可以很清晰的看到,图像放大的原理是先把四像素图片填充到原图部分对应的四个位置,然后以这四个位置为基准,剩余的未填充像素做插值,边缘部分的像素插值需要利用插值部分的像素点,因此纹理重复设置会影响到图片放大后的效果。再结合上面的代码可知,glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 这行代码决定了插值部分是直接重复原图部分。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);决定了图像放大后的插值是线性插值,当然,GL_LINEAR也可以换成其他值,比如GL_NEAREST,表示直接取临近点像素,不插值

三、拓展

关于缩小的原理,可以在这个网站去看,原理类似
https://webgl2fundamentals.org/webgl/lessons/webgl-3d-textures.html

本文地址:https://blog.csdn.net/jianminfly/article/details/107332803

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网