4.1 开始
要想构筑充满细节的画面,光靠单色和渐变色是不行的。大多数时候画面都是由带纹理的图形构成的,本篇就来探索 OpenGL 怎样将纹理应用到项目中,学习应用纹理的不同方法。
4.2 配置 SOIL
为了应用纹理,我们需要将纹理加载到内存中,而加载纹理的程序并没有在 OpenGL 中提供,需要自行实现或使用图像加载库,比如 SOIL。SOIL(Simple OpenGL Image Library) 就是简易 OpenGL 图像库的缩写。
4.2.1 下载
官方下载地址:http://www.lonesock.net/soil.html
也可以下载我的 CSDN 资源,其中还包含了本篇中用到的图片。
4.2.2 生成 lib
配置 SOIL 的方法与 GLFW 和 GLEW 类似,但是不需要使用 CMake 构建。下载解压后打开 /project/VC9(如果你的 VS 版本太低,使用低版本目录)下的 SOIL.sln 解决方案文件,在 VS 中生成解决方案。
4.2.3 配置目录
与之前类似,在项目中配置 include、lib、链接器->输入:
4.3 纹理
2D 纹理也就是一张 2D 图片(也有 1D、3D 的纹理),比起使用单色或渐变色,使用纹理可以增添许多细节,使画面更加生动,这也是现代游戏最基本的展现画面的方法,纹理在游戏中也被称为贴图。
4.3.1 加载纹理
我们使用 SOIL 库来加载纹理,新建项目后首先是像上面那样配置好项目,再将头文件包含进去。
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
// 使用 SOIL 头文件
#include <SOIL.h>
// 使用上一篇里的着色器类
#include "Shader.h"
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
代码整体结构如下:
int main() {
// GLFW 和 GLEW 的代码,创建窗口、定义变量等
...
// 配置着色器,使用着色器函数加载、编译、链接着色器源码
Shader ourShader("useTexture.vgl", "useTexture.fgl");
// 创建和使用 VBO、VAO、EBO
...
// --== 创建纹理对象,加载图像 ==--
...
// 主循环
while (!glfwWindowShouldClose(window)) {
// 处理事件,设置背景色
...
// 绑定纹理对象,函数会自动把纹理赋值给片段着色器的采样器
glBindTexture(GL_TEXTURE_2D, texture);
// 使用着色器
ourShader.use();
// 绘制图像,交换缓冲
...
}
}
将本地图片导入到项目目录下,项目结构如图。在代码中使用 SOIL_load_image()
将其加载到内存中。
// 创建纹理对象
GLuint texture;
// 生成 1 个纹理
glGenTextures(1, &texture);
// 将纹理绑定到 GL_TEXTURE_2D