游戏引擎开发-图形篇(三)——纹理

在上篇博客中,我们完成了OpenGL的光栅化过程,本次将会聚焦纹理贴图及纹理映射的原理及应用


原理讲解

何为纹理

纹理贴图是在光栅化的模型表面上覆盖图像的技术。它是为渲染场景添加真实感的最基本和最重要的方法之一。————蓝宝书

在实际的开发中,只是利用着色器为模型表面上色是不现实的,因此我们需要一个能将图像直接覆盖在模型上的技术,纹理由此而生。

我们需要将绘制纹理的方法,也就是纹理坐标告知着色器,这样我们才能将纹理应用于对象的渲染表面。虽然3D纹理也是存在的,但因为2D纹理才是业界主流,我们基本使用二维坐标来描述纹理,理想情况中,纹理坐标应该在0到1的范围内取值。

OpenGL中的纹理

与所有的OpenGL对象一样,OpenGL也是申请后利用ID应用,使用纹理的具体方法将在本段具体说明。

首先为了读取图像需要引入库,使用stbi_load能够加载大部分流行的图片格式。然后我们使用glGenTextures注册纹理,并使用glTexImage2D生成纹理。最后我们将纹理坐标告知VAO(在成熟的商业引擎中将会采用UV映射的方式,无需我们手动指定),即可应用纹理。

具体实现方法可以在网上搜到,这里不作讲解。


踩过的坑

纹理部分向来是我苦手的部分,不过好在借助第三方调试器的帮助下这次是得以解决。尤其要注意的是在开发的时候就要编写调试层除错,遇到不正确显示的情况也不要着急,回想渲染管线的流程一个部分一个部分的排查,有必要就自己动笔建立数学模型。任何的图形开发问题都可以归纳为“数据问题”和“计算问题”,只要熟练就能掌握诀窍。

昨天写完这部分忘记截图就开始做下一个部分了,所以本期没有截图,真是非常抱歉。

3D模型的光栅化很早就做好了,不过只是多几个图元罢了没什么好讲的,准备等摄像机做完了连着坐标系统再一起讲,再下下期讲光照,然后图形部分就可以收尾了。