基于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相关的一些库的名词, 才发现是不同时期不同版本不断发展的结果. ...
随机推荐
- PyEchart--数据分析师的利器
Echart https://echarts.baidu.com/ ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...
- flink ---- 系统内部消息传递的exactly once语义
At Most once,At Least once和Exactly once 在分布式系统中,组成系统的各个计算机是独立的.这些计算机有可能fail. 一个sender发送一条message到rec ...
- LeetCode_448. Find All Numbers Disappeared in an Array
448. Find All Numbers Disappeared in an Array Easy Given an array of integers where 1 ≤ a[i] ≤ n (n ...
- FFmpeg在VS2017下的编译
今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境. 简单记录下过程,以防将来重装系统等情况,备忘. https://git ...
- Python之路【第二十四篇】:数据库索引
数据库索引 一.索引简介 索引在mysql中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈 ...
- Python之路【第十六篇】:Python并发编程|进程、线程
一.进程和线程 进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作), 而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源. 是 ...
- PostgreSQL学习笔记(一)—— macOS下安装
安装命令:brew install postgresql 我的终端是zsh,所以添加环境变量到~/.zshrc vim ~/.zshrc export PATH=$PATH:/usr/local/Ce ...
- SQL SERVER 查询所有表大小
DECLARE @T TABLE ( [name] VARCHAR(max), [rows] INT, reserved VARCHAR(max), data_size VARCHAR(max), i ...
- CLRS10.2-7练习 - 翻转单向列表
要求: Give a Θ(n)-time nonrecursive procedure that reverses a singly linked list of nelements. The pro ...
- 【爬坑笔记】c# 如何通过EF Core读写sql server的类似double型字段
=============================================== 2019/8/31_第1次修改 ccb_warlock == ...