[OpenGL]OpenGL纹理

本文详细介绍了OpenGL纹理的使用,包括纹理的概念、纹理环绕方式、纹理过滤、多级渐远纹理以及如何加载与创建纹理。讲解了如何利用stb_image.h库加载不同格式的图像,并展示了从纹理坐标到采样的过程,以及如何处理纹理坐标超出[0,1]范围的情况。同时,讨论了线性过滤和邻近过滤的区别,以及多级渐远纹理在处理远处物体纹理时的优势。最后,提到了纹理单元的概念,允许在着色器中使用多个纹理。" 96475684,8694971,Python编程:逻辑运算符与条件判断,"['Python编程', '逻辑判断', '数学算法', '控制结构', '数据结构']
摘要由CSDN通过智能技术生成

1.纹理

纹理是一个2D图片,甚至有可能是1D 和3D纹理,纹理是用来添加物体的细节,可以想象纹理是一张绘有砖块的纸,贴在一面白色的墙上,这样看起来墙就有砖块外表了。
纹理除了图像以外,纹理可以被用来存储大量的数据,这些数据可以发送到着色器上

纹理坐标在x和y轴上,范围为[0,1](用的2D纹理图像),使用纹理坐标获取纹理颜色叫做采样,纹理坐标起始于(0,0),也就是纹理图片的左下角,终于(1,1),即纹理图片的右上角。

假如,我们现在要把一张砖块的纸,贴到之前画的三角形上。。。
为了能够把纹理映射到三角形上,需要指定三角形的每个顶点各自对应纹理的哪个部分,这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明从纹理图像哪个部分采样,之后再图形的其他片段上进行插值。
在这里插入图片描述
如上图,我们为红色的三角形指定3个纹理坐标,

float texCoords[] = {
    0.0f, 0.0f, // 左下角
    1.0f, 0.0f, // 右下角
    0.5f, 1.0f // 上中
};

2.纹理环绕方式

纹理坐标的范围是从(0,0)到(0,1),那如果我们把纹理坐标设置在范围之外呢?OpenGL默认的行为是重复这个纹理图像
环绕类型:

(1)GL_REPEAT 对纹理的默认,重复纹理图像
在这里插入图片描述
(2)GL_MIRRORED_REPEAT 和GL_REPEAT一样,但是重复的图片是镜像放置的
在这里插入图片描述
(3)GL_CLAMP_TO_EDGE 纹理坐标会被余数在0和1之间,超出的部分会重复纹理坐标边缘,产生一种被拉伸效果
在这里插入图片描述
(4)GL_CLAMP_TO_BORDER 超出的坐标为用户指定的边缘颜色

使用glTexParameter 函数对单独的一个坐标轴设置(s,t,r)*

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

第一个参数指定了纹理目标,使用的是2D纹理,GL_TEXTURE_2D 第二个参数指定设置的选项与应用的纹理轴,并且指定s和t轴
第三个参数纹理环绕方式

如果我们选择GL_CLAMP_TO_BORDER,还需要指定一个边缘颜色,使用glTexParameterfv,
使用GL_TEXTURE_BORDER_COLOR

float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);

3.纹理过滤

纹理坐标不依赖于分辨率,可以是任意浮点值,所以 OpenGL需要知道怎样将纹理像素映射到纹理坐标?

我们主要对OpenGL的GL_NEARESTGL_LINEAR两种纹理过滤

纹理像素:当我们打开一张.jpg格式图片,不断放大我们就会发现图片是由无数像素点组成的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值