基于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相关的一些库的名词, 才发现是不同时期不同版本不断发展的结果. ...
随机推荐
- k8s记录-kubeam方式部署k8s
参考:https://blog.csdn.net/networken/article/details/84991940 # k8s工具部署方案 # 1.集群规划 | **服务器** | || ---- ...
- aps.net StateServer设置
1.在 system.web节点 加 <sessionState mode="StateServer" stateConnectionString="tcpip=1 ...
- tomcat 启动和关闭脚本
start.sh #!/bin/sh . ~/.bash_profile echo "" > ${TOMCAT_HOME}/logs/catalina.out; sh ${T ...
- Archer代码生成器前端
import {getList, getDetail, add, update, remove} from "@/api/sales/sales"; import {getList ...
- Python正则简单实例分析
Python正则简单实例分析 本文实例讲述了Python正则简单用法.分享给大家供大家参考,具体如下: 悄悄打入公司内部UED的一个Python爱好者小众群,前两天一位牛人发了条消息: 小的测试题: ...
- 金钱数友好显示 php版本
2019年6月28日16:35:10 此方法可扩展性较好 /* * 吧金额数字转成可视化的方便读的汉字表述 */ function amountConversion(float $amount = 0 ...
- [数据结构 - 第3章] 线性表之双向链表(C语言实现)
一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...
- 【转帖】Intel AMD 龙芯2019年12月份最新产品线
Intel未来三代U集体曝光:14nm退回去了! https://news.cnblogs.com/n/651244/ 不过没搞懂 为啥中芯国际已经开始量产14nm了 龙芯为什么不用.. 3A4000 ...
- Python之路【第二十七篇】:web服务器django
Django 一.web框架 框架,即时framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单的说,就是用别人搭建好的舞台来表演你的才艺 ...
- Ramdisk根文件系统映像的修改与创建
本文简述Ramdisk根文件系统映像的修改以及创建,并附相关脚本以实现自动化配置,而根文件系统的制作过程请网上自行搜索.相关过程尽可能以图的方式展示出来,重在说明操作的过程,仅供参考. Ramdisk ...