TEXTURES

引言

上次我们探讨了智能指针和引用,今天我们将开始实际创建我们自己的第一个资产类型。

今天我们实际上要从我们的计算机加载一个文件,它可以是自己创建的任何文件,我们将加载它并在引擎中显示它。这很令人兴奋。

纹理

在开始之前,我想先谈一谈“纹理”实际上是什么,以及它们在游戏中的用途。

纹理其实就是一段内存或者缓存,我们将它上传到 GPU,由顶点着色器和片段着色器访问。GPU 会对纹理进行采样,从该纹理图像返回某种颜色。它的本质就是让我们的着色器渲染给定的像素时查找某个值,例如 PBR 或者 BRDF 渲染有许多复杂的数学运算很难做到实时,所以我们实际上可以离线完成它们,然后将结果存储在查找纹理中(纹理中已经存储了所有这些已经预先计算的值)。

现在要做的是修改我们的顶点缓冲区,以便它实际上包含我们正方形每个角落的纹理坐标;我们还需要一个纹理类,它会加载该文件并将其上传到我们的 GPU,我们还从中获取一个渲染 ID,这样就可以在运行时使用将创建的 API 绑定。

纹理类

纹理基类头文件包含析构函数、长宽的访问器以及绑定函数。.cpp 文件则是像顶点数组一样筛选不同的图形 API 生成不同的纹理类型。

接着创建 OpenGLTexture 纹理类,加入私有成员变量:

std::string m_Path;
uint32_t m_Width, m_Height;
uint32_t m_RendererID;

涵盖了纹理的文件路径、宽高以及渲染 ID。

加载图像

现在需要我们加载图像。从技术上讲作为引擎的资产,我们可能不会依赖任何现有的图像格式如 PNG 或 JPEG,今后可能会创造自己的纹理格式。

目前最简单的方式是使用 stb 的 C++库,帮助我们在 C++ 中加载图像。

拷贝 stb_image.h

引入第三方库修改预生成文件。

调试