8个版本
0.1.7 | 2023年8月3日 |
---|---|
0.1.6 | 2023年8月3日 |
0.1.3 | 2023年7月31日 |
#110 在 图形API 中
42 每月下载量
8.5MB
4K SLoC
包含(静态库,2MB)lib/windows/freetype.lib,(静态库,1MB)lib/linux/libfreetype.a,(静态库,2MB)lib/windows/glad.lib,(静态库,1MB)lib/linux/libglad.a,(静态库,725KB)lib/windows/cgl.lib,(静态库,700KB)lib/windows/glfw3.lib 和更多。
索引
CGL
CGL(C图形库)是一个多用途库,主要用于娱乐编程/演示场景/原型设计/小型游戏/实验。它提供了许多图形功能。最好的一点是,所有这些功能都包含在单个头文件cgl.h
中。此外,CGL完全用C编写,但也与C++兼容。
注意:不要认为头文件只会增加编译时间,因为只需要通过使用#define CGL_IMPLEMENTATION
来启用1个文件的实现。参见示例
目标平台
- Windows
- Linux
- MacOS(未测试)
- WebAssembly(Beta)
- Android(即将推出)
CGL提供什么?
-
cgl-rs
- A Rust包装器(https://crates.io/crates/cgl-rs)
-
cgl-py
- A Python包装器(https://pypi.ac.cn/project/cgl-py)
-
窗口库(可选)
- 您可以通过使用
#define CGL_EXCLUDE_WINDOW_API
完全禁用它 - 这个窗口库主要是对GLFW的封装,并增加了一些额外功能。例如,如果您使用某些库(如
nuklear
)进行GUI开发,它将干扰所有glfw
回调,因此您可以使用CGL通过调用CGL_window_resecure_callbacks
来恢复CGL回调。
- 您可以通过使用
-
实用功能
- 读取/写入文件
- 随机浮点数/整数/布尔值/vec2/vec3/颜色生成
- CRC32/CRC64
- ROT13加密
- 通用哈希函数参考这里
- 彩色printf(红色、绿色、蓝色、灰色/黄色)
- 点/三角形交点检查
- 3D变换API(矩阵计算等)
- TODO:[MD5 / SHA 256 / SHA 128 / AES]
-
噪声API
- libc的rand的多个快速替代方案
- 过程式一致噪声算法
- Perlin噪声(改进版本)
- OpenSimplex2
- 值噪声
- Worley噪声(或细胞噪声)
- 分形如FBm、Rigid、Billow、PingPong
- 八度音程/Lacunarity/加权强度/增益参数
-
三角剖分
- Bower Watson算法用于Delaunay三角剖分器
-
人工智能
- 神经网络
- 反向传播
- 序列化/反序列化网络
- 多元线性回归
-
图算法
- A*路径查找(通用)
- N维空间划分和定位(四叉树的n维版本)
-
数据结构
- 列表(动态数组)+栈(一起实现)
- 哈希表 -> 这个哈希表是通用的。键可以是字符串或n位缓冲区。值可以是任何东西:int、string、float、自定义类型等...
- 哈希表迭代器 -> 使用简单的API迭代哈希表参考这里
-
日志记录器
- 可以通过
#define CGL_DISABLE_LOGGER
启用/禁用。 - 同时记录到多个日志文件
- 以彩色输出记录到控制台,不同日志级别分开
- 带自动时间戳的日志记录器
- 可以通过
-
跨平台网络(可选)
- 您可以通过
#define CGL_EXCLUDE_NETWORKING
禁用所有网络功能。 - 低级套接字
- SSL套接字(可选)(需要OpenSSL)
- HTTP/HTTPS请求(beta)
- 您可以通过
-
通用马尔可夫链(可选)示例
- 可以与任何类型的数据(文本/图像等)一起工作
- 用3-4行代码进行训练/生成
- 实现文本生成的训练器(基于n-gram)
- 用于自定义场景的自定义训练器API
-
跨平台多线程
- 线程
- 互斥锁
- 条件变量(TODO)
- 注意:在Windows上使用
Win32 Threads
实现,在Linux上使用pthread
实现。(在Linux上,您需要链接pthread
来构建)
-
布隆
- 只需一行代码即可将布隆应用于任何纹理
- 基于Unity的布隆实现
- 自定义阈值
- 自定义下采样/上采样遍历
- 完全在Compute Shaders中实现
-
2D碰撞检测
- 检测2D多边形之间的碰撞
- 为多边形生成分离轴
- 获取重叠距离
- GJK(Gilbert–Johnson–Keerthi距离算法)
- EPA(扩展多边形算法)
- SAT(分离轴定理)
-
Marching Square
- 完全可定制的Marcher
- 支持线性插值
- 为CGL生成2D网格(三角形)
-
卡通后处理器
- 轮廓效果
- 卡通着色效果
- 阴影效果
- 在单个后处理调用中完成(无需逐对象计算)
- 完全在Compute Shader中实现
- 可定制
-
CGL射线投射
- 快速2D射线投射
- 自定义墙壁
- 烘焙到三角形网格
- 公开射线投射函数
-
CGL节点编辑器
- 速度非常快,因为它由CGL Widgets提供动力
- 自定义节点、引脚、链接
- 最小化且功能强大
- 渲染您自己的节点和链接类型API
- 缩放放大/缩小
- 全局偏移
-
CGL音频API
- 跨平台(OpenAL后端)
- 简单的API
- WAV文件加载/采样器
-
CSV API
- CSV解析器
- CSV序列化器
- CSV文档数据结构
-
CGL Widgets(可选)
- 您可以通过以下方式禁用它:
#define CGL_EXCLUDE_WIDGETS
- 类似于p5.js的API
- 文本小部件(渲染高质量清晰的文本,无需加载或烘焙任何字体)
- 批渲染后端(即使对于大量小部件也非常快)
- 绘制(填充或描边)
- 三角形
CGL_widgets_add_triangle
- 通用四边形
CGL_widgets_add_quad
- 矩形[
CGL_widgets_add_rect
CGL_widgets_add_rect2f
] - 线条
CGL_widgets_add_line
- 圆形[
CGL_widgets_add_circle
CGL_widgets_add_circle2f
] - 椭圆形[
CGL_widgets_add_oval
,CGL_widgets_add_oval2f
] - 圆弧
- 三角形
- 绘图
- 散点图
- 柱状图(垂直/水平)
- 饼图
- 绘制函数
- 基于字体的文本小部件(使用小部件API加载自定义字体以进行高质量的文本渲染)
- 支持使用小部件API渲染3D网格
- 支持将纹理添加到小部件API(高效)
- 高级贝塞尔曲线(线条或点状)小部件
- 添加单个顶点
- 调整描边颜色/粗细
- 自定义批渲染最大顶点容量(适用于内存较低的系统)
- 您可以通过以下方式禁用它:
-
数学库
- 高级矩阵库(这是与图形矩阵库分开的)
- 用于矩阵数学的线性代数
- vec2/vec3/vec4
- mat3/mat4(用于图形)
- add/sub/mul/div/scale/length/normalize/lerp/min/max/equal for vec2/vec3/vec4
- rotate_x/rotate_y/rotate_z for vec3
- scale/translate/rotate_x/rotate_y/rotate_z/add/sub/mul for mat4
- perspective for mat4
- transpose for mat4/(mat3 TODO)
- 使用Goldman方法创建旋转矩阵
- look_at矩阵
- 四元数数学
- 转换向量
- 注意:大多数数学函数都是通过宏实现的,因此将完全倾斜并且非常快,无需进行任何不必要的函数调用
- 高级矩阵库(这是与图形矩阵库分开的)
-
可选的(可选)高级OpenGL API
- 您可以通过以下方式完全禁用它:
#define CGL_EXCLUDE_GRAPHICS_API
- 纹理(2D / 2D数组 / 立方体贴图)
- 帧缓冲区
- SSBO(着色器存储缓冲区对象)
- UBO(统一缓冲区对象)
- 着色器
- 顶点 & 片段(不包含几何着色器,因为它不太常用)
- 计算着色器API
- 您可以通过以下方式完全禁用它:
-
CGL网格API
- CGL为处理网格提供高级API
- 有2种类型的网格
- CPU网格 -> 存储用于网格操作的数据,例如
- 生成三角形
- 生成四边形
- 加载OBJ(beta)
- 生成立方体
- 生成平面
- 生成圆柱体
- 生成球体
- 从任何参数曲面函数生成网格参考这里
- 计算法线
- 对网格进行操作
- 添加2个网格
- 偏移顶点
- 等等。
- GPU网格 -> 指向存储在GPU侧的数据的指针(内部处理顶点缓冲区、索引缓冲区、顶点数组)并可用于
- 渲染
- 渲染实例化
- 渲染线框
- 渲染线框实例化
- CPU网格 -> 存储用于网格操作的数据,例如
-
CGL相机
- CGL提供适当的相机抽象
- 透视 & 正交
- 内部处理所有矩阵计算(只需输入位置和旋转)
- 自动计算向上、向右、向前向量
-
文本渲染(可选)(需要FreeType2)
- 您可以使用
#define CGL_EXCLUDE_TEXT_RENDER
完全禁用它 - 从
.ttf
文件中加载字体 - 烘焙字符位图
- 从字符串烘焙纹理
- 您可以使用
-
尾迹渲染器
- 快速3D尾迹渲染器
- 烘焙到网格
- 自定义着色器支持
- 完全可定制
-
天空渲染器(可选)
- 您可以使用
#define CGL_EXCLUDE_SKY_RENDERER
完全禁用它 - 支持天空盒(立方体网格)和天空球/圆顶(球体网格)
- 支持立方体贴图天空纹理
- 支持实时过程生成天空(+过程云)
- 只需3-5行代码即可渲染出美丽的天空
- 您可以使用
-
Phong渲染器(可选)
- 您可以通过
#define CGL_EXCLUDE_PHONG_RENDERER
禁用它 - 它具有
- Phone管道 -> 这是包含着色器数据和全局引擎数据的管道。可用的选项包括
- 启用/禁用Blinn校正
- 启用/禁用深度测试
- 启用/禁用伽玛校正
- 设置环境光照
- 添加/删除光源
- Phong光源 -> 它可以是3种类型之一
- 方向性 -> 它接受(方向,颜色,强度)
- 点 -> 它接受(位置,颜色,强度,常数,线性,二次方)
- 聚光灯(待定)
- Phong材质
- 取消纹理/颜色
- 镜面纹理/颜色
- 光泽度
- 法线贴图(待定)
- Phone管道 -> 这是包含着色器数据和全局引擎数据的管道。可用的选项包括
- 您可以通过
-
瓦片图渲染器(可选)
- 您可以使用
#define CGL_EXCLUDE_TILEMAP_RENDERER
禁用它 - 使用单行代码渲染NxN瓦片图
- 每个瓦片都可以有以下状态
- 清除(透明或不启用)
- 纯色
- 纹理 -> 纹理可以通过以下方式提供
- 2D纹理数组 -> 您需要为每个瓦片提供深度
- 瓦片集或纹理图集 -> 您必须提供用于瓦片的区域边界(归一化0.0-1.0)
- 注意:此瓦片渲染器仅渲染4个顶点,并且只有一个绘制调用(不是实例调用,因此相当快)
- 您可以使用
正在开发中的内容
- PBR渲染器(可选)
- IBL(可选)
展示片
查看: 这里
**更多信息请参见示例