opengl+glfw+glew+SOIL显示图片

2024-02-29 04:40
文章标签 显示 图片 opengl soil glfw glew

本文主要是介绍opengl+glfw+glew+SOIL显示图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需要用的SOIL
SOIL:Simple OpenGL Image Library
http://www.lonesock.net/soil.html

在包含目录和库目录设置SOIL的目录

使用SOIL读取图片为opengl设置纹理

#include <iostream>
#include <Windows.h>
#define _USE_MATH_DEFINES
#include <math.h>// GLEW    
#include <GL/glew.h>    // GLFW 
#include <GLFW/glfw3.h>   // SOIL
#include <SOIL.h>GLuint WIDTH = 400, HEIGHT = 400;
GLfloat xRot = 0.0f;
GLfloat yRot = 0.0f;#define TEXTURE_CNT     2
GLuint textures[TEXTURE_CNT];//存储2个纹理void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
void windowResize_callback(GLFWwindow* window, int width, int height);void loadTexture(const char* filePath, int index)
{int picWidth, picHeight;int channel = 0;unsigned char* imgData = SOIL_load_image(filePath,&picWidth, &picHeight, &channel, SOIL_LOAD_RGB);if (NULL == imgData){OutputDebugString(L"SOIL_load_image failed \r\n");return;}glGenTextures(1, &textures[index]);glBindTexture(GL_TEXTURE_2D, textures[index]);glTexImage2D(GL_TEXTURE_2D, 0, 3, picWidth, picHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, imgData);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 线形滤波glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 线形滤波SOIL_free_image_data(imgData);
}void DrawCube(void)         // 从这里开始进行所有的绘制
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存glEnable(GL_TEXTURE_2D);//启用纹理贴图glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);//指定纹理贴图与材质的混合模式glColor4f(1.0, 1.0, 1.0, 1.0);glLoadIdentity();         // 重置当前的模型观察矩阵//glTranslatef(0.0f, 0.0f, -5.0f);         // 移入屏幕 5 个单位glRotatef(xRot, 1.0f, 0.0f, 0.0f);         // 绕X轴旋转glRotatef(yRot, 0.0f, 1.0f, 0.0f);         // 绕Y轴旋转glBindTexture(GL_TEXTURE_2D, textures[1]);      // 选择纹理glBegin(GL_QUADS);// 前面glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f); // 纹理和四边形的左上// 后面glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); // 纹理和四边形的左下// 顶面glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); // 纹理和四边形的右上glEnd();glFlush();glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);//指定纹理贴图与材质的混合模式glBindTexture(GL_TEXTURE_2D, textures[0]);      // 选择纹理glBegin(GL_QUADS);// 底面glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); // 纹理和四边形的右下// 右面glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); // 纹理和四边形的左下// 左面glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); // 纹理和四边形的右下glTexCoord2f(1.0f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); // 纹理和四边形的左上glEnd();glFlush();}void render(GLFWwindow* window)
{glClearColor(1.0f, 0.8f, 1.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);//DrawLine();//DrawBezier();//Draw3d();DrawCube();
}void initWindow(GLFWwindow* window)
{glfwMakeContextCurrent(window);//设置按键回调glfwSetKeyCallback(window, key_callback);//设置窗口大小改变的回调,让绘画区域在窗口中间glfwSetWindowSizeCallback(window, windowResize_callback);
}void initParam()
{//显示规则:窗口左下角坐标为0,0;所以下行代码表示在窗口左下角向右向上的400个像素单位作为画布glViewport(0, 0, WIDTH, HEIGHT);//设置显示区域400*400,但是可以拖动改变窗口大小glLineWidth(3.0);//设置线条宽度,3个像素glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);//设置点圆滑glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);//设置线光滑glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}//启用文字,不支持汉字、unicode
void initData()
{loadTexture("D:\\2.jpg", 0);loadTexture("D:\\222huojian.jpg", 1);
}int main()
{glfwInit();GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", nullptr, nullptr);if (window == nullptr){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}initWindow(window);if (glewInit() != GLEW_OK){std::cout << "Failed to initialize GLEW" << std::endl;return -1;}initParam();initData();// Game loop    while (!glfwWindowShouldClose(window)){glfwPollEvents();render(window);glfwSwapBuffers(window);}// Terminate GLFW, clearing any resources allocated by GLFW.    glfwTerminate();return 0;
}void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{if (key == GLFW_KEY_UP)xRot -= 5.0f;else if (key == GLFW_KEY_DOWN)xRot += 5.0f;else if (key == GLFW_KEY_LEFT)yRot -= 5.0f;else if (key == GLFW_KEY_RIGHT)yRot += 5.0f;
}void windowResize_callback(GLFWwindow* window, int width, int height)
{WIDTH = HEIGHT = width > height ? height : width;//左下角是0, 0坐标, x,y说就是相对于左下角的像素距离glViewport((width - WIDTH) / 2, (height - HEIGHT) / 2, WIDTH, HEIGHT);
}

原理:

SOIL读取图片信息,宽高都要是2的倍数,图片不行就换图片,中能找到一个用得上的

创建的关键代码:

	glGenTextures(1, &textures[index]);glBindTexture(GL_TEXTURE_2D, textures[index]);glTexImage2D(GL_TEXTURE_2D, 0, 3, picWidth, picHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, imgData);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 线形滤波glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 线形滤波

生成一个name,这个name实际是个int

绑定,

绑定后生成的纹理就对应创建的name。

使用的关键代码:

	glEnable(GL_TEXTURE_2D);//启用纹理贴图glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);//指定纹理贴图与材质的混合模式glColor4f(1.0, 1.0, 1.0, 1.0);glBindTexture(GL_TEXTURE_2D, textures[1]);      // 选择纹理

启用纹理

设置模式

设置颜色:其实也没那么重要,除非有其他需要设置颜色的地方,这里就要重置自己的颜色

选择纹理,指定name,接下来就是使用指定的name贴图

效果:

这篇关于opengl+glfw+glew+SOIL显示图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757608

相关文章

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk