【LearnOpenGL】P5 生成带纹理的矩形

Code有毒
发布于

0 上一章讲到如何生成一个彩色的矩形。这一章我们将主要引入纹理这个概念。并且编写三件关于纹理图像的例子:

(1)设置单一纹理的矩形。

(2)设置多纹理混合的矩形。

(3)探索放大\缩小时的纹理过滤方式。

1 设置单一纹理的矩形

1.0 使用开源库stb_image(https://github.com/nothings/stb/blob/master/stb_image.h)。将stb_image的头文件添加进我们的项目中。

1.1 在main.cpp的顶部添加宏和stb_image.h的包含。其中宏的作用是将stb_image.h转为cpp来调用。

 

1.2 生成一个纹理对象,设置该纹理对象的环绕方式和过滤方式。使用stb_image的接口加载纹理图片(一张墙壁的纹理图纸),并将纹理图片的信息附加到纹理对象上。(记得及时释放掉图片信息的资源)

 

1.3 在顶点着色器源码中添加一个location为2的2维向量来表示纹理坐标信息。并将纹理坐标信息输出给片段着色器。

 

1.4 在片段着色器源码中我们通过传入的纹理坐标和使用uniform设置的采样器纹理变量共同生成一个纹理色彩传给FragColor。

 

1.5 我们在main()里的vertices后面添加纹理坐标信息。纹理坐标信息的范围在0到1.0之间,坐标原点在左下角,如果超过1.0,则会对纹理图像进行特殊处理(后面会讲到)。

 

1.6 重新解释vertices数组中的数据排列的步长和偏移量。

 

1.7 将纹理单元绑定到0号位。(没有特意的去将片段着色器中的OurTexture设置为0号位,因为此时只有一个纹理信息,OpenGL默认将其设置为了0号位)

 

1.8 编译运行后得到一个带有墙壁纹理的矩形图像。

 

1.9 如果我们不满足单调的纹理,我们可以在纹理的基础上再添加其他的颜色。在片段着色器源码中,在纹理颜色的基础上再乘一个颜色值。

 

1.10 编译运行后可得到一个带有附加颜色的纹理矩形。

 

2 设置多纹理混合的矩形

2.0 在片段着色器中添加两个纹理采样变量,将FragColor的颜色设置为由两个纹理图像融合的颜色。(其中0.2这个融合比例值表示纹理1的颜色占用80%,纹理2的颜色占用20%)

 

2.1 在main()的第一纹理对象后面再添加第二个纹理对象。将第二张图片(一个贱贱的笑脸)加载到第二个纹理对象中。

 

2.2 由于此时程序中有两个纹理对象需要设置,所以不能跟之前一样让OpenGL自己默认设置片段着色器中纹理采样变量的位置值了。需要手动地对纹理采用变量设置其对应的位置值。

 

2.3 将两个纹理对应绑定到纹理采用位置中。

 

2.4 编译运行后可得到一个倒转的笑脸融合墙壁纹理的矩形。

 

2.5 由于stb_image传入的图片其y轴与OpenGL的y轴正好相反,所以使用stb_image的接口反转图片的y轴后,得到正确方向的纹理图像。

 

 

3 探索放大\缩小时的纹理过滤方式

3.0 之前在vertices中设置的纹理坐标范围控制在了0到1.0之间。现在我们将纹理坐标值扩大到2.0。

 

3.1 编译运行程序,此时会出现矩形的面积大于纹理图像的情况。且纹理重复的方式为”重复图像”。

 

3.2 我们可以将第一个纹理对象的纹理环绕方式改为延伸像素边缘。此时得到的图像将不再是两个纹理均为重复,而是第一个纹理为边缘延伸,第二个纹理为重复。

 

 

3.3 刚刚我们将纹理坐标扩大到了2.0,现在我们再试试看将纹理坐标缩小到0.45-0.55看看会是什么效果。

 

3.4 可以看到在矩形范围内,我们只加载了面积非常小的一块纹理图像被加载了。(此时纹理过滤方式为线性插值)

 

3.5 将纹理过滤方式从线性插值改为取最近点。图像的像素块会更明显。

 

 

4 最后我们实现一个通过键盘上下两个键,动态调整两个纹理图像混合比例的功能。

4.0首先在main()前设置一个全局的控制混合比例的参数。

 

4.1 然后在键盘触发响应的回调函数中设置混合比例参数的调整。

 

4.2 在片段着色器中添加一个纹理混合比例参数。

 

4.3 在渲染循环中,动态的设置纹理混合比例参数。

 

4.4 编译运行程序,可以得到一个可以通过上下键控制纹理混合比例的矩形图像。

 


原文

评论
收藏