下面是使用GLFW库缩放纹理并显示的一个简单示例:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <SOIL/SOIL.h>
#include <iostream>
// 窗口大小
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
// 纹理缩放比例
float scale = 1.0f;
void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mode) {
// 按下Esc键退出程序
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
// 缩放纹理,按上下箭头键增加或减小缩放比例
if (key == GLFW_KEY_UP && action == GLFW_PRESS)
scale += 0.1f;
if (key == GLFW_KEY_DOWN && action == GLFW_PRESS)
scale -= 0.1f;
}
int main() {
// 初始化GLFW库
if (!glfwInit()) {
std::cout << "Failed to initialize GLFW" << std::endl;
return -1;
}
// 创建窗口和OpenGL上下文
GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Texture Scaling", nullptr, nullptr);
if (!window) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 初始化GLEW库
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
std::cout << "Failed to initialize GLEW" << std::endl;
return -1;
}
// 设置键盘回调函数
glfwSetKeyCallback(window, keyCallback);
// 加载纹理图片
int width, height;
unsigned char* image = SOIL_load_image("texture.jpg", &width, &height, 0, SOIL_LOAD_RGB);
// 创建OpenGL纹理对象
GLuint texture;
glGenTextures(1, &texture);
// 绑定纹理并设置参数
glBindTexture(GL_TEXTURE_2D, texture);
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);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 加载纹理数据到显存中
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width,height , 0,GL_RGB,GL_UNSIGNED_BYTE,image);
// 释放图像内存
SOIL_free_image_data(image);
while (!glfwWindowShouldClose(window)) {
// 清空屏幕颜色缓冲区和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 缩放纹理矩形的大小
float scaledWidth = width * scale;
float scaledHeight = height * scale;
// 计算纹理显示位置,居中显示在窗口中心
float xPos = (WINDOW_WIDTH - scaledWidth) / 2.0f;
float yPos = (WINDOW_HEIGHT - scaledHeight) / 2.0f;
// 设置视口大小和位置
glViewport(xPos, yPos, scaledWidth, scaledHeight);
// 绘制纹理矩形
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0);
glTexCoord2f(0.0f, 1.0f); glVertex2d(-1.0, 1.00);
glEnd();
// 处理窗口事件并交换缓冲区
glfwSwapBuffers(window);
glfwPollEvents();
}
// 删除纹理对象并终止GLFW库
glDeleteTextures(1,&texture );
glfwTerminate();
return 0;
}
此示例使用了SOIL库来加载纹理图片,你需要在项目中添加相应的头文件和链接SOIL库。还要确保在正确的路径下放置名为”texture.jpg”的纹理图片。请根据实际情况进行适当修改。
运行该程序后,你可以通过按上下箭头键来增加或减小纹理的缩放比例。窗口中心将显示被缩放后的纹理图像。
内容由零声教学AI助手提供,问题来源于学员提问




