在前面的章节中我们都是使用简单的形体配合颜色都行绘制,这好像缺失了什么,想象下如果我们可以在形体上添加一些更细致的信息呢?就像艺术家一样,我们可以一开始用简单的颜色绘制一些基础形状,然后使用纹理映射添加额外的信息的形体表面;纹理就是一个已经加载到OpenGL中的简单图形或者图像。
使用纹理映射可以添加一些难以想象的细节,想象下你最近玩过的3D游戏,就像其他的3D游戏一样最核心的也仅仅就是使用点、线、三角形这些元素;然后再配合上纹理映射或者艺术家的技巧,这些三角形就被渲染成了一个精美的3D场景。
一旦我们开始使用纹理,也同样意味着会使用多个着色器程序;为了便于管理,我们将学习如何改造代码使得可以使用多个颜色器程序及顶点数据,并在他们之间切换。
下面是这一章节的主要内容:
- 首先学习纹理映射,然后用代码实现加载纹理到OpenGL中。
- 然后学习如何显示已经加载的纹理,改造我们代码以支持多个着色器程序。
- 我们也会学习不同的纹理过滤模式及过程模式的作用。
当我们学习完成这章节后,我们的桌面将会如下图所示,首先拷贝一份上一章节的代码并命名为AirHockeyTextured。
下面是这一章节的内容划分:
- 7.7 小结(A Review)
我们现在知道如何加载及显示纹理了,也知道如果重构代码以便可以使用不同的着色器及顶点数据;我们可以调整纹理坐标或者拉伸、压缩纹理本身以适应纹理的形状来改善纹理显示效果。
纹理并不会直接被OpenGL绘制,他们需要绑定到纹理单元然后把纹理单元传递给着色器;我们也可以在同一纹理单元中交换使用不同的纹理来绘制不同的纹理,但是过度的交换可能会降低性能。我们也可以使用多个纹理单元同时绘制多个不同的纹理。
- 7.8 练习(Exercises)
试着加载一个不同的纹理,并用额外的纹理单元将这个纹理与当前纹理进行混合;当你在片元着色器中给变量gl_FragColor赋值的时候可以把两个不同纹理的值相加或者相乘。
一旦你完成了这个练习,在下一章节中我们将会学习如果提升两个小球的显示效果(点击进入下一章)。
最后附上本章源代码(点击下载)