ZBLOG

使用glfw缩放纹理并显示的例子

下面是使用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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9082

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?