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_NEAREST和GL_LINEAR两种纹理过滤
纹理像素:当我们打开一张.jpg格式图片,不断放大我们就会发现图片是由无数像素点组成的