基于glew,freeglut的imshow
OpenGL显示图片,这篇博客使用glew + freeglut + gdal来实现imshow。
主要修改:
使用BGR而不是RGB,保持和opencv行为一致
纯C,去掉C++相关的
去掉GDAL,使用stb image读取图像
提供了完整的CMakeLists.txt脚本
glew-2.1.0:编译安装
glew-2.1.0/build/vs2017-x64.bat
@echo off
set BUILD_DIR=vs2017-x64
if not exist %BUILD_DIR% md %BUILD_DIR%
cd %BUILD_DIR%
cmake -G "Visual Studio 15 2017 Win64" ^
-D CMAKE_INSTALL_PREFIX=%cd%/install ^
../cmake
cd ..
pause
freeglut-3.0.0:编译安装
freeglut-3.0.0/build/vs2017-x64.bat
@echo off
set BUILD_DIR=vs2017-x64
if not exist %BUILD_DIR% md %BUILD_DIR%
cd %BUILD_DIR%
cmake -G "Visual Studio 15 2017 Win64" ^
-D CMAKE_INSTALL_PREFIX=%cd%/install ^
../..
cd ..
pause
读取图像:使用stb image替代gdal
参考的博客中,gdal用来读取图像,官方repo拒绝提供CMakeLists,有人维护了带CMake支持的版本。但下载仍然不方便,也没有必要使用。自行封装stb image即可,参照基于GDI的imshow:使用stb_image读取图像并修正绘制,使用fc_image.h和fc_image.c即可。
主函数代码
#include <stdio.h>
#include <gl/glew.h> // 包含最新的gl.h,glu.h库
#include <gl/freeglut.h> // 包含OpenGL实用库
#include <assert.h>
#include "fc_image.h"
unsigned int texture; // 纹理对象
unsigned char* imgBuf = NULL;
int imgWidth;
int imgHeight;
void ReadImage()
{
const char* im_pth = "F:/zhangzhuo/dev/libfc/imgs/fruits.jpg";
FcImage im = fc_load_image(im_pth);
int buf_sz = im.c * im.h * im.w;
imgWidth = im.w;
imgHeight = im.h;
imgBuf = (unsigned char*)malloc(buf_sz);
memcpy(imgBuf, im.data, buf_sz);
}
void InitGL()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH); //平滑着色
glEnable(GL_DEPTH_TEST); //深度测试
glEnable(GL_CULL_FACE); //只渲染某一面
glFrontFace(GL_CCW); //逆时针正面
glEnable(GL_TEXTURE_2D); //启用2D纹理映射
//载入纹理图像:
ReadImage();
//生成纹理对象:
glGenTextures(1, &texture);
}
void DrawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texture); //绑定纹理:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //支持4字节对齐
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); //S方向上贴图
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); //T方向上贴图
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //放大纹理过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //缩小纹理过滤方式
glTexImage2D(GL_TEXTURE_2D, 0, 3, imgWidth, imgHeight, 0, GL_BGR, GL_UNSIGNED_BYTE, imgBuf); //载入纹理:
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity();
glEnable(GL_TEXTURE_2D); //启用2D纹理映射
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置OpenGL窗口大小
{
glViewport(0, 0, width, height);
}
int main(int argc, char* argv[], char* envp[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutInitWindowSize(600, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("opengl");
InitGL();
glutDisplayFunc(DrawGLScene);
glutReshapeFunc(ReSizeGLScene);
//glutKeyboardFunc(keyboard);
//glutMouseWheelFunc(mouse_wheel);
//glutIdleFunc(idle);
glutMainLoop();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(opengl_imshow)
include_directories(
"F:/zhangzhuo/dev/glew-2.1.0/build/vs2017-x64/install/include"
"F:/zhangzhuo/dev/freeglut-3.0.0/build/vs2017-x64/install/include"
)
link_directories(
"F:/zhangzhuo/dev/glew-2.1.0/build/vs2017-x64/install/lib"
"F:/zhangzhuo/dev/freeglut-3.0.0/build/vs2017-x64/install/lib"
)
add_executable(imshow
src/opengl_imshow.c
src/stb_image.h
src/fc_image.h
src/fc_image.c
)
target_link_libraries(imshow glew32 freeglutd)

基于glew,freeglut的imshow的更多相关文章
- codeblocks opengl glew freeglut 2020.11.15
https://wenku.baidu.com/view/28cd5ebfaf1ffc4fff47accf.html 一下为测试代码 /* ============================== ...
- OpenGL超级宝典visual studio 2013开发环境配置,GLTools
做三维重建需要用到OpenGL,开始看<OpenGL超级宝典>,新手第一步配置环境就折腾了一天,记录下环境的配置过程. <超级宝典>中的例子使用了GLEW,freeglut以及 ...
- [翻译]opengl扩展教程1
[翻译]opengl扩展教程1 原文地址https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/extensions.php [翻译]ope ...
- 【GLSL教程】(四)shder的简单示例 【转】
http://blog.csdn.net/racehorse/article/details/6638455 GLSL的Hello World 这一节中包含一个最基本的shader,它提供如下功能:顶 ...
- 【GLSL教程】(五)卡通着色 【转】
http://blog.csdn.net/racehorse/article/details/6641623 引言 卡通着色可能是最简单的非真实模式shader.它使用很少的颜色,通常是几种色调(to ...
- openGL起飞篇
我的技术路线:glfw+glad(有了glfw,什么glew,freeglut都不要了) GLFW:直接下载,然后新建vs项目,在<VC++>的<包含目录>添加include路 ...
- opengl库区分:glut、freeglut、glfw、glew、gl3w、glad
//oepngl库 opengl原生库 gl* 随opengl一起发布 opengl实用库 glu* 随opengl一起发布 opengl实用工具库glut glut* 需要下载配置安装(太老了!) ...
- 配置自己的OpenGL库,glew、freeglut库编译,库冲突解决(附OpenGL Demo程序)
平台:Windows7,Visual C++ 2010 1. 引言 实验室的一个项目,用到OpenGL进行实时绘制,还用到一些其他的库,一个困扰我很久的问题就是编译时遇到的各种符号未定义,符号重定义之 ...
- 一张图弄懂opengl的诸多库gl glu glut freeglut glew glfw之间关系
开始学习opengl,但是看opengl编程指南不同版本之间使用了一堆不同的库,概念名称全都搅起的,越看越糊涂,遂整理的一下opengl相关的一些库的名词, 才发现是不同时期不同版本不断发展的结果. ...
随机推荐
- (原创)C++ 同步队列
(原创)C++ 同步队列 同步队列作为一个线程安全的数据共享区,经常用于线程之间数据读取,比如半同步半异步线程池的同步队列. 其实做起来比较简单,要用到list.锁和条件变量,条件变量的作用是在队列满 ...
- Thinkphp5 实现动态模板主题多个模板切换
在项目开发过程中会遇到一个网站有不同风格,本文详细介绍Thinkphp5 实现模板主题多个模板切换 一.在Config中配置view_path模板路径代码如下 1 2 3 4 5 6 7 8 9 10 ...
- linux安装nvm和nodejs
下载nvm包: [root@centos ~]# wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install ...
- notepad++去掉红色波浪线
1 在notepad++的首页上找到插件菜单,并点击打开插件设置的下拉菜单. 2 下拉菜单中有一个菜单项是DSpellCheck,这个菜单项的子项中有一项是Spell Check Document ...
- matlab学习笔记12单元数组和元胞数组 cell,celldisp,iscell,isa,deal,cellfun,num2cell,size
一起来学matlab-matlab学习笔记12 12_1 单元数组和元胞数组 cell array --cell,celldisp,iscell,isa,deal,cellfun,num2cell,s ...
- PMP 第5章错题总结
1.工作分解结构是项目团队与相关方之间沟通的有效工具之一2.控制账户是工作分解结构某个层次上的要素,以便与工作包一一对应3.项目范围说明书包括产品范围.产品验收标准.项目可交付成果.项目除外责任,以及 ...
- SpringMVC基本
SpringMVC和Struts2的区别 SpringMVC与Struts2区别 对比项目 SrpingMVC Struts2 优势 国内市场情况 有大量用户,一般新项目启动都会选用springmvc ...
- 将.cer证书导入java密钥库?
导入.cer从浏览器下载的证书文件(打开网址并挖掘详细信息)到cacerts keystore中java_home\jre\lib\security为我工作,而不是尝试生成和使用我自己的密钥库. 去你 ...
- Redis 的主从复制(Master/Slave)
目录 1. 是什么 2. 能干嘛 3. Redis主从复制讲解 (1). info replication:查看 目标redis 主从情况 (2) . 配从库不配主库 (3). 常用策略 (4). 复 ...
- 如何利用Docker构建基于DevOps的全自动CI
来自用户的DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量.私有代码库与私有镜像库的应用等. (一)容器服务的Rancher选型 1.为什么说是下 ...