导航:首页 > 净水问答 > opengl过滤颜色

opengl过滤颜色

发布时间:2025-04-01 13:02:35

Ⅰ OpenGL自学笔记(五)(纹理映射)

纹理映射技术允许在三维物体上应用2D图像,以增添细节。每个顶点可关联一个纹理坐标,从而从图像中选择采样颜色并进行片段插值。纹理坐标范围0-1,左下角起始,不依赖分辨率,可为任意浮点值。

为了将纹理映射到物体上,需定义顶点对应的纹理部分,每个顶点关联纹理坐标,用于指定从纹理图像的哪个位置采样颜色,进行片段差值。纹理坐标是模型顶点的数组,OpenGL以此顶点纹理坐标数据查找图像上的像素进行采样。

纹理坐标用于指示从纹理图像的特定部分采样颜色,用于顶点着色器中的片段着色器。通过纹理坐标获取颜色称为采样,且纹理坐标不依赖于分辨率,可以是任意浮点数。

创建纹理对象通常使用glGenTextures函数,绑定至目标(如GL_TEXTURE_2D),并设置环绕方式和过滤方式,管理采样方式。环绕方式默认为四方连续平铺,用于纹理超出范围时的采样。过滤方式包括邻近过滤和线性过滤,分别处理纹理放大或缩小时的像素格问题。

多级渐远纹理(MipMap)用于减少内存浪费,为远距离小物体提供不同分辨率的纹理图像。使用MipMap技术在不同的距离上使用不同分辨率的纹理,减少放大或缩小纹理时的视觉问题。纹理过滤方式包括GL_NEAREST_MIPMAP_NEAREST到GL_LINEAR_MIPMAP_LINEAR,分别对应不同情况下的采样方法。

加载纹理图像通常使用如stb_image.h库,它能够加载多种流行格式的图像。首先添加库至工程,并定义STB_IMAGE_IMPLEMENTATION预处理器宏,使其包含库的函数定义源码。通过stbi_load函数加载图像,然后使用glTexImage2D生成纹理,加载基本级别的纹理图像。若需使用多级渐远纹理,可手动设置所有不同的图像或使用glGenerateMipmap自动生成。

应用纹理的基本流程涉及创建纹理对象、加载图像、生成纹理,绑定纹理对象至着色器中的采样器。顶点着色器接收顶点数据,包括纹理坐标,片段着色器接收纹理坐标和采样器,使用GLSL的texture函数采样纹理颜色。渲染矩形时,自动绑定纹理至片段着色器采样器,调用绘制函数显示纹理效果。

多个纹理的渲染通过多个纹理单元实现。每个纹理单元有位置值,可通过glUniform1i分配给采样器。激活纹理单元后,绑定纹理至指定单元,允许在片段着色器中使用多个纹理。输出可以对多个纹理进行混合,使用GLSL的mix函数线性插值颜色。最终流程包括创建纹理对象、载入图片、生成纹理,绑定多个纹理至纹理单元,定义采样器位置,渲染时自动使用纹理进行显示。

在某些情况下,可能会遇到渲染窗口中的报错,这通常与输入法设置有关,切换输入法或检查环境配置即可解决。对于纹理上下颠倒的问题,可通过在加载时反转y轴坐标来调整图像方向,确保纹理正确显示。

Ⅱ OpenGL-Texture Filtering(纹理过滤)

周一到周五,每天一篇,北京时间早上7点准时更新~跟着我们一起一天天进步和成长吧

在处理纹理贴图时,纹理上的像素与屏幕上的像素通常不会有直接的一一对应关系。为了使纹理贴图效果与屏幕显示匹配,需要通过纹理坐标进行采样。然而,由于纹理图像在应用到几何表面时,总是会被拉伸或缩小,这导致纹理坐标可能无法精确对应到像素上。特别是3D物体带有方向信息时,纹理可能在不同维度上被拉伸和缩小。这就引入了纹理过滤的概念,即如何在拉伸或缩小纹理时计算颜色片段。

为了实现非整数纹理坐标到像素的颜色采样,我们使用了`texture()`函数,它接收浮点数纹理坐标。该函数将坐标范围从0.0到1.0映射到纹理上,不过,不是所有0.0到1.0之间的值都能直接对应到一个纹理像素,某些坐标可能落在像素之间。此外,纹理坐标可以超出0.0到1.0的范围。接下来的章节将详细介绍OpenGL如何通过这些浮点数坐标采样纹理图片,生成像素值。

纹理过滤是计算拉伸或缩小纹理上的颜色片段的过程。拉伸纹理称为放大,而缩小纹理称为缩小。通过设置采样器参数,OpenGL允许我们为放大和缩小条件设置值的构造方法,这些条件称为滤镜。放大滤镜的参数名为`GL_TEXTURE_MAG_FILTER`,缩小滤镜的参数名为`GL_TEXTURE_MIN_FILTER`。当前可选择的基本滤镜有两个:`GL_NEAREST`和`GL_LINEAR`,分别对应最近邻过滤和线性过滤。确保为`GL_TEXTURE_MIN_FILTER`选择这两种滤镜之一,因为默认滤镜设置在没有mipmap时无效。

最近邻过滤是最简单、最快的过滤方法,其特点是将纹理坐标直接映射到纹理像素上,并使用落点的像素颜色作为片段颜色。在信号处理中称为点采样。然而,当纹理被拉伸时,这种过滤方式会产生较大的像素块,如图5.7左侧示例所示。你可以通过以下函数设置放大和缩小滤镜:

线性过滤需要更多的计算,但通常值得额外的开销。现代硬件上,线性过滤的成本接近于零。线性过滤通过应用纹理坐标周围纹理像素的加权平均值(线性插值)来进行,而不是取最近的纹理像素。要使采样出来的颜色与纹理颜色完全匹配,纹理坐标需要正好位于纹理像素的中心。线性过滤在纹理被拉伸时会产生模糊的图形,但这种模糊往往能带来更真实、更自然的外观,而不是最近邻过滤方式产生的尖锐块状效果。如图5.7右侧示例所示,你可以通过以下代码设置线性过滤:

通过比较图5.7的左右两幅图片,我们可以看到应用最近邻过滤后,图像呈现出明显的块状和锯齿效应,尤其是在对比度高的区域。相比之下,使用线性过滤的图像则更加平滑(尽管可能略显模糊)。

总结,我们的课程中使用`texture`系列函数,考虑到某些旧版本和OpenGL ES 2.0不支持整型数据,整型的`texelFetch`函数不具备通用性。然而,随着硬件的发展,未来可能支持整型数据的版本,这句“假命题”可能会发生变化。谁知道呢?

今天的翻译就到这里,明天再见,拜拜~

想要第一时间获取最新内容,可以关注东汉书院和图形之心公众号

期待在东汉书院与你相遇,一起学习进步!

阅读全文

与opengl过滤颜色相关的资料

热点内容
室内油烟净化器怎么使用 浏览:104
污水所有规范 浏览:717
小米空气净化器2怎么洗 浏览:80
目前焦化废水处理成本是多少 浏览:812
喝回奶宝用多少水 浏览:631
厕所污水抽出来怎么办 浏览:615
java循环过滤 浏览:968
13年ats空调滤芯怎么拆 浏览:410
380伏污水泵如何改成220伏 浏览:902
四川农村污水监测粪大肠 浏览:907
台式奥克斯饮水机没电怎么办 浏览:803
小苏打用作鱼塘水处理 浏览:287
随动式污水池膜结构 浏览:31
北京回张家口用隔离14天吗 浏览:193
净水器怎么分一二三滤芯 浏览:157
怎么知道净水器进水电磁阀坏了 浏览:421
做一个门牙树脂套的价格 浏览:720
ao史密斯净水器换错滤芯怎么赔偿 浏览:926
医院乱排放废水 浏览:420
空调滤芯真假怎么辨别 浏览:834