欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

opengl纹理缩放的原理

程序员文章站 2022-08-12 10:49:24
一、背景用OpenGL处理3dlut映射的时候,lut滤镜数据输入到纹理后,不经过任何处理直接输出,图像两边会有错误的像素点出现,如下(更换了图片,以便验证结果的一般性)如上图,在边缘出现了模糊的颜色二、原因在我的测试demo中有以下代码设置纹理的属性// 当纹理坐标超出范围时,重复当前纹理glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE...

一、背景

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

二、原因

在我的测试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,然后输出,原图和输出结果如下
opengl纹理缩放的原理
原因已经渐渐清晰了,再看下图
opengl纹理缩放的原理如上图所示,可以很清晰的看到,图像放大的原理是先把四像素图片填充到原图部分对应的四个位置,然后以这四个位置为基准,剩余的未填充像素做插值,边缘部分的像素插值需要利用插值部分的像素点,因此纹理重复设置会影响到图片放大后的效果。再结合上面的代码可知,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