下面是一个使用GLFW库加载并缩放纹理并将其显示在窗口中的简单示例代码:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
// 定义窗口宽度和高度
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
int main() {
// 初始化 GLFW
glfwInit();
// 创建窗口,并设置OpenGL版本号为3.3
GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Texture Scaling Example", nullptr, nullptr);
glfwMakeContextCurrent(window);
// 初始化GLEW,确保OpenGL函数指针正常工作
glewExperimental = GL_TRUE;
glewInit();
// 加载纹理图片
int imageWidth, imageHeight, numChannels;
stbi_set_flip_vertically_on_load(true); // 垂直翻转图像数据,因为OpenGL纹理坐标原点在左上角
unsigned char* imageData = stbi_load("texture.jpg", &imageWidth, &imageHeight, &numChannels, 0);
if (!imageData) {
std::cerr << "Failed to load texture" << std::endl;
return -1;
}
// 创建并绑定纹理对象
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
// 设置纹理参数:缩小过滤器使用线性插值,放大过滤器使用最近邻插值
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// 加载纹理数据到显存中
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0, GL_RGB,
GL_UNSIGNED_BYTE, imageData);
// 释放图像数据
stbi_image_free(imageData);
while (!glfwWindowShouldClose(window)) {
// 清空缓冲区
glClear(GL_COLOR_BUFFER_BIT);
// 计算纹理缩放比例
float scaleX = static_cast<float>(WINDOW_WIDTH) / imageWidth;
float scaleY = static_cast<float>(WINDOW_HEIGHT) / imageHeight;
// 绘制一个矩形,并将纹理应用于它上面
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-scaleX, -scaleY);
glTexCoord2f(1.0f, 0.0f); glVertex2f(scaleX, -scaleY);
glTexCoord2f(1.0f, 1.0f); glVertex2f(scaleX, scaleY);
glTexCoord2f(0.0f, 1.0f); glVertex2f(-scaleX, scaleY);
glEnd();
glfwSwapBuffers(window);
glfwPollEvents();
}
// 清除并删除纹理对象
glBindTexture(GL_TEXTURE_2D, 0);
glDeleteTextures(1,&textureID);
glfwTerminate();
return 0;
}
在示例代码中,我们首先使用stb_image库加载纹理图像,并将其数据上传到显存中。然后,在主循环中,我们计算了纹理的缩放比例,以适应窗口的大小,并使用OpenGL函数绘制一个矩形,将纹理应用于它上面。
请注意,这只是一个简单的示例,仅演示了如何使用GLFW库加载和缩放纹理。完整的实际项目可能需要更多的代码和处理步骤来完成其他任务,例如初始化OpenGL环境、编译着色器程序等。
内容由零声教学AI助手提供,问题来源于学员提问