我用的stb_image.h加载图片到程序中,它下载地址和配置方式可见https://blog.csdn.net/derbi123123/article/details/105610298
加载、绑定、设置纹理应用方式的函数:
unsigned int loadTexture(char const * path)
{
//纹理也是使用ID引用的。让我们来创建一个
//glGenTextures函数首先需要输入生成纹理的数量,
//然后把它们储存在第二个参数的unsigned int数组中
//(我们的例子中只是单独的一个unsigned int)
unsigned int textureID;
glGenTextures(1, &textureID);
int width, height, nrComponents;
//要使用stb_image.h加载图片,我们需要使用它的stbi_load函数:
unsigned char *data = stbi_load(path, &width, &height, &nrComponents, 0);
//首先接受一个图像文件的位置作为输入。
//接下来它需要三个int变量作为它的第二、第三和第四个参数
//stb_image.h将会用图像的宽度、高度和颜色通道的个数填充这三个变量。
//我们之后生成纹理的时候会用到的图像的宽度和高度的。
if (data)
{
GLenum format;
//根据上面得到颜色通道的个数调整颜色显示方式
if (nrComponents == 1)
format = GL_RED;
else if (nrComponents == 3)
format = GL_RGB;
else if (nrComponents == 4)
format = GL_RGBA;
//我们需要绑定纹理,让之后任何的纹理指令都可以配置当前绑定的纹理
glBindTexture(GL_TEXTURE_2D, textureID);
//生成2D纹理
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
//为当前绑定的纹理自动生成所有需要的多级渐远纹理
glGenerateMipmap(GL_TEXTURE_2D);
//纹理环绕方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//纹理过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
stbi_image_free(data);
}
else
{
std::cout << "Texture failed to load at path: " << path << std::endl;
stbi_image_free(data);
}
return textureID;
}
关于纹理的函数并不是这里的重点,还有很多设置纹理性质的参数,以及对上面纹理函数的说明还是要自己查并体会。
在程序中,我们只需要:unsigned int 纹理的ID = loadTexture("纹理图片的路径");
当然,别忘了在绘制前绑定相应的纹理让OpenGL知道你要应用哪副纹理到物体上:
glActiveTexture(GL_TEXTURE0);//当前物体上的第0幅纹理
glBindTexture(GL_TEXTURE_2D, 纹理ID);
//如果一个物体要应用多幅纹理接着按顺序开启并绑定就行了
可能在不同情况下要修改一些参数,不过所需要的主要函数就这些了。