介绍

是在 github 上找到的一个开源项目,先简单介绍一下 PainterEngine

项目链接:

https://github.com/matrixcascade/PainterEngine

PainterEngine 是一个由 C 语言编写的跨平台图形引擎, 支持 Windows/Linux/iOS/Android/WebAssembly/HarmonyOS 甚至无操作系统的裸嵌入式平台, 它基于组件化的设计模式, 即使是 C 语言初学者, 也可以在几分钟内掌握它的使用, PainterEngine Make 允许您一键将您的 PainterEngine 项目编译到多个平台. 它涵盖了基础数据结构、图形学、声学、数字信号处理、编译原理、虚拟机系统、密码学、人机交互、游戏引擎、神经网络、FPGA-GPU 图形 IP 设计等多个领域, 你既可以用它制作微应用, 也可以将它作为学习项目。

不仅是图形库, 更是应用程序框架

功能 支持内容 描述
内存池 alloc/free 平台无关的内存池实现
数学库 sin/cos/tan/arcsin/log/exp/relu/... 绝大部分 C 标准数学库的完整实现
信号处理 dft/dct/fft/dwt/window functions/mfcc/... 傅里叶/余弦/小波变换, 常用窗函数, mfcc 等特征采集算法...等等信号处理相关基础函数及上层特征采集算法
数据结构 string/vector/list/map/stack/fifo/circular-buffer/... 平台无关的数据结构算法实现
密码学 curve25519/AES/SHAx/MD5/... 包含常用的密钥对称算法及密钥协商算法
神经网络 BP Neutral Network 经典BP神经网络框架,可实现简单分类问题
图片支持 PNG/JPG/GIF/BMP 支持 PNG/JPG/GIF/BMP 解码及 PNG 编码
音频支持 WAV/MP3 支持 Wav, Mp3 解码及 Wav 编码
字模支持 ttf 支持 ttf 字模文件(由 stb_truetype.c 移植而来)
几何绘制 Line/Triangle/Rectangle/Circle/Ring/Sector/Rounded/... 常用几何光栅化实现
渲染器 2D/3D 2D/3D 渲染器实现及一个高质量制图引擎
动画 2dx/live2D 2D 动画和一个类 Live2D 骨骼动画系统
声学模型 mixer/piano/ks 包含一个混音器实现, 一个相位声码器, 一个物理建模的钢琴及 karplus-strong 合成的拨弦模型, 直接合成 PCM 音频流
脚本引擎 Compiler/VM/Debugger 一个完整的脚本引擎, 包含编译器虚拟机调试器
UI 框架 button/radio/image/edit/label/list/... UI 框架实现
协议 MQTT/MODBUS/Game-network-synchronization 常用的通讯协议
游戏引擎 集成一个游戏世界框架
跨平台显示服务 VisualOS platform/visualos提供了一个基于TCP网络的显示服务器,可以完成cs/bs架构的远程界面交互连接,为没有显示条件的设备提供图形操作终端
FPGA-GPU 2D accelerator 实现了基于 FPGA 的 GPU 图形加速器, 能够为 PainterEngine 提供不低于 50Mpps 的 2D Blender 及图元光栅化加速, 支持 HDMI 输出, 目前已在 zynq7000 系列 Soc 上完成验证

FPGA-GPU 嵌入式图形加速方案

提供一个基于 FPGA 的 GPU IP 核, 已在 Zynq7020 上完成功能验证, 提供不低于 50Mpps 的 2D Blender 图形渲染加速, 支持 HDMI 输出, 目前已在 zynq7000 系列 Soc 上完成验证.


在 Ubuntu 20.04 上编译并运行

下载源码,得到一个 PainterEngine-master 文件夹

depend 文件夹中有 freeglut 文件夹,需要下载 freeglut 的源码放进来

freeglut 源码地址:

https://github.com/freeglut/freeglut/

下载后解压缩,将整个源码放入 depend/freeglut 文件夹中,确保 CMakeLists.txt 在 depend/freeglut 目录下


编译分为两种:动态链接库静态链接库

推荐动态链接库:

自动处理“间接依赖”:当链接动态库(.so)时,这个库本身已经知道它依赖于 GLX11Xi 等库。链接器在处理项目时,会顺着 .so 找到这些底层依赖,不需要在 target_link_libraries 里手动写底层库名。


动态链接库编译:

在 PainterEngine-master 路径下打开终端:

mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make

可以看到 在 build/lib 下生成了 .so 文件:


测试

编写一个最简单的 PainterEngine 程序,新建一个 src/main.c 文件

#include "PainterEngine.h"
int main()
{
    PainterEngine_Initialize(800,480);
    return 1;
}

创建 CMakeLists.txt 文件:

gedit CMakeLists.txt

 /home/likcu/ku/PainterEngine/PainterEngine-master 换成你自己的 源码路径

cmake_minimum_required(VERSION 3.10)
project(test)

find_package(Threads REQUIRED)

# 定义库的路径
set(PAINTERENGINE_INCLUDE_DIR /home/likcu/ku/PainterEngine/PainterEngine-master)
set(PAINTERENGINE_LIBRARY /home/likcu/ku/PainterEngine/PainterEngine-master/build/lib/libPainterEngine.so)

# 添加可执行文件
add_executable(test ./src/main.c)

# 包含头文件目录
target_include_directories(test PRIVATE 
	${PAINTERENGINE_INCLUDE_DIR}
)

# 链接库
target_link_libraries(test 
	${PAINTERENGINE_LIBRARY} 
	Threads::Threads
	m dl      
)

编译运行测试代码:

mkdir build
cd build
cmake ..
make
./test

出现了一个图形化窗口


静态链接库编译

编译 PainterEngine 时直接 cmake ..

mkdir build
cd build
cmake ..
make

会在 build/lib 下生成 .a 文件


测试

代码不变,CMakeLists.txt 需要修改:

cmake_minimum_required(VERSION 3.10)
project(test)

find_package(X11 REQUIRED COMPONENTS Xi Xrandr Xxf86vm)
find_package(OpenGL REQUIRED)

# 定义库的路径
set(PAINTERENGINE_INCLUDE_DIR /home/likcu/ku/PainterEngine/PainterEngine-master)
set(PAINTERENGINE_LIBRARY /home/likcu/ku/PainterEngine/PainterEngine-master/build/lib/libPainterEngine.a)

set(FREEGLUT_ROOT /home/likcu/ku/PainterEngine/PainterEngine-master/depend/freeglut/freeglut)
set(FREEGLUT_INCLUDE_DIR ${FREEGLUT_ROOT}/include)
set(FREEGLUT_LIBRARY ${FREEGLUT_ROOT}/lib/libglut.a)

# 添加可执行文件
add_executable(test ./src/main.c)

# 包含头文件目录
target_include_directories(test PRIVATE 
	${PAINTERENGINE_INCLUDE_DIR}
	${FREEGLUT_INCLUDE_DIR}
	${OPENGL_INCLUDE_DIR}
)

# 链接库
target_link_libraries(test 
	${PAINTERENGINE_LIBRARY} 
	${FREEGLUT_LIBRARY}       
	${OPENGL_LIBRARIES}   
	${X11_LIBRARIES} 
	${X11_Xi_LIB} 
	${X11_Xrandr_LIB} 
	${X11_Xxf86vm_LIB}
	m pthread dl       
)

编译运行:

cmake ..
make
./test

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐