QT开发中文网

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

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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?