bgfx - 跨平台渲染库
项目标题与描述
bgfx是一个跨平台、图形API无关的“自带引擎/框架”风格渲染库。它提供了一套统一的接口,让开发者能够在不同的图形API和平台上使用相同的代码进行渲染,极大地简化了跨平台图形应用的开发流程。
该项目支持多种主流的渲染后端,包括Direct3D 11/12、Metal、OpenGL、Vulkan等,以及从Android到WebGL的广泛平台支持,使其成为游戏开发、实时渲染和图形应用的理想选择。
功能特性
- 跨平台支持:支持Android、iOS、Linux、macOS、Windows等多平台
- 图形API无关:统一接口支持Direct3D、OpenGL、Vulkan、Metal等主流图形API
- 高性能渲染:优化的渲染管线和资源管理机制
- 灵活的集成方式:"Bring Your Own Engine/Framework"设计理念
- 丰富的工具链:包含调试工具、性能分析工具等
- 活跃的社区支持:拥有Discord聊天社区和GitHub讨论区
- 完善的文档:提供详细的API参考、示例和构建指南
- 模块化设计:可单独使用或与其他引擎集成
安装指南
系统要求
- 编译器:支持C++11的编译器(GCC、Clang、MSVC等)
- 构建系统:支持GN、CMake、Make等构建系统
- 依赖项:
- 各平台对应的图形API SDK
- 可选:GLM数学库、STB图像库等
构建步骤
-
克隆仓库
git clone https://github.com/bkaradzic/bgfx.git cd bgfx -
生成构建文件
# 使用CMake cmake -B build -DCMAKE_BUILD_TYPE=Release -
编译项目
cmake --build build --config Release -
运行示例
cd build/bin ./example-00-helloworld
平台特定说明
- Windows:需要安装Windows SDK和DirectX SDK
- macOS/iOS:需要Xcode和Metal SDK
- Android:需要Android NDK和SDK
- Linux:需要OpenGL开发包和相应驱动
使用说明
基础初始化
以下是一个简单的bgfx初始化示例:
#include <bgfx/bgfx.h>
#include <bx/bx.h>
int main() {
// 初始化bgfx
bgfx::Init init;
init.type = bgfx::RendererType::Count; // 自动选择渲染器
init.resolution.width = 1280;
init.resolution.height = 720;
init.resolution.reset = BGFX_RESET_VSYNC;
if (!bgfx::init(init)) {
// 处理初始化失败
return -1;
}
// 设置视图
bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x303030ff);
bgfx::setViewRect(0, 0, 0, 1280, 720);
// 主循环
while (!shouldExit()) {
// 开始帧
bgfx::touch(0);
// 渲染代码...
// 结束帧
bgfx::frame();
}
// 关闭bgfx
bgfx::shutdown();
return 0;
}
创建渲染程序
// 顶点着色器
static const char* vsCode = R"(
attribute vec3 a_position;
attribute vec4 a_color0;
varying vec4 v_color0;
void main() {
gl_Position = vec4(a_position, 1.0);
v_color0 = a_color0;
}
)";
// 片段着色器
static const char* fsCode = R"(
varying vec4 v_color0;
void main() {
gl_FragColor = v_color0;
}
)";
// 创建着色器程序
bgfx::ShaderHandle vsh = bgfx::createShader(
bgfx::makeRef(vsCode, (uint32_t)strlen(vsCode))
);
bgfx::ShaderHandle fsh = bgfx::createShader(
bgfx::makeRef(fsCode, (uint32_t)strlen(fsCode))
);
bgfx::ProgramHandle program = bgfx::createProgram(vsh, fsh, true);
渲染几何体
// 定义顶点结构
struct PosColorVertex {
float x, y, z;
uint32_t abgr;
};
// 创建顶点声明
bgfx::VertexLayout layout;
layout.begin()
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true)
.end();
// 创建顶点缓冲区
PosColorVertex vertices[] = {
{ -0.5f, -0.5f, 0.0f, 0xff0000ff },
{ 0.5f, -0.5f, 0.0f, 0xff00ff00 },
{ 0.0f, 0.5f, 0.0f, 0xffff0000 }
};
bgfx::VertexBufferHandle vbh = bgfx::createVertexBuffer(
bgfx::makeRef(vertices, sizeof(vertices)),
layout
);
// 渲染循环中
bgfx::setVertexBuffer(0, vbh);
bgfx::setState(BGFX_STATE_DEFAULT);
bgfx::submit(0, program);
纹理使用示例
// 加载纹理
bgfx::TextureHandle texture = bgfx::createTexture2D(
256, 256, false, 1,
bgfx::TextureFormat::BGRA8,
BGFX_TEXTURE_NONE | BGFX_SAMPLER_NONE,
nullptr
);
// 设置纹理
bgfx::setTexture(0, textureUniform, texture);
// 带纹理的着色器
static const char* texturedFsCode = R"(
uniform sampler2D s_texColor;
varying vec2 v_texcoord0;
void main() {
gl_FragColor = texture2D(s_texColor, v_texcoord0);
}
)";
核心代码
渲染器抽象层
/**
* 渲染器抽象基类
* 提供统一的渲染接口,具体实现由各平台渲染后端完成
*/
class Renderer {
public:
virtual ~Renderer() = default;
// 初始化渲染器
virtual bool init(const Init& init) = 0;
// 关闭渲染器
virtual void shutdown() = 0;
// 重置渲染目标
virtual void reset(const Reset& reset) = 0;
// 提交渲染命令
virtual void submit(ViewId view, ProgramHandle program) = 0;
// 设置顶点缓冲区
virtual void setVertexBuffer(
uint8_t stream,
VertexBufferHandle handle,
uint32_t startVertex,
uint32_t numVertices
) = 0;
// 设置索引缓冲区
virtual void setIndexBuffer(
IndexBufferHandle handle,
uint32_t firstIndex,
uint32_t numIndices
) = 0;
// 设置渲染状态
virtual void setState(uint64_t state, uint32_t rgba = 0) = 0;
// 设置纹理
virtual void setTexture(
uint8_t stage,
UniformHandle sampler,
TextureHandle texture,
uint32_t flags = UINT32_MAX
) = 0;
};
资源管理
/**
* 资源管理器
* 负责管理GPU资源的生命周期
*/
class ResourceManager {
public:
ResourceManager();
~ResourceManager();
// 创建顶点缓冲区
VertexBufferHandle createVertexBuffer(
const Memory* mem,
const VertexLayout& layout,
uint16_t flags = BGFX_BUFFER_NONE
);
// 创建索引缓冲区
IndexBufferHandle createIndexBuffer(
const Memory* mem,
uint16_t flags = BGFX_BUFFER_NONE
);
// 创建纹理
TextureHandle createTexture(
const Memory* mem,
uint64_t flags = BGFX_TEXTURE_NONE,
uint8_t skip = 0,
TextureInfo* info = nullptr
);
// 创建着色器程序
ProgramHandle createProgram(
ShaderHandle vsh,
ShaderHandle fsh,
bool destroyShaders = false
);
// 销毁资源
void destroy(VertexBufferHandle handle);
void destroy(IndexBufferHandle handle);
void destroy(TextureHandle handle);
void destroy(ProgramHandle handle);
private:
// 资源映射表
typedef bx::HashMap<
uint64_t,
Resource*,
1024,
bx::Hash<bx::StringView>
> ResourceMap;
ResourceMap m_vertexBuffers;
ResourceMap m_indexBuffers;
ResourceMap m_textures;
ResourceMap m_programs;
// 内存分配器
bx::AllocatorI* m_allocator;
};
统一着色器系统
/**
* 统一着色器接口
* 支持多种着色器语言和平台
*/
class UniformShaderSystem {
public:
UniformShaderSystem();
// 编译着色器
ShaderHandle compileShader(
const char* source,
ShaderType type,
const char* defines = nullptr
);
// 链接程序
ProgramHandle linkProgram(
ShaderHandle vertexShader,
ShaderHandle fragmentShader
);
// 设置统一值
void setUniform(
UniformHandle handle,
const void* value,
uint16_t num = 1
);
// 预编译着色器缓存
void precompileShaders(
const char* shaderPath,
const char* outputPath
);
private:
// 着色器编译器
class ShaderCompiler {
public:
enum class Language {
GLSL,
HLSL,
MSL,
SPIRV
};
// 跨平台着色器编译
bool compile(
Language sourceLang,
Language targetLang,
const char* source,
const char* entryPoint,
const char* profile,
std::vector<uint8_t>& output
);
};
ShaderCompiler m_compiler;
bx::HashMap<
uint64_t,
ShaderBinary,
512,
bx::Hash<bx::StringView>
> m_shaderCache;
};
渲染命令队列
/**
* 渲染命令队列
* 实现命令缓冲和延迟执行
*/
class RenderCommandQueue {
public:
RenderCommandQueue();
// 添加命令到队列
template<typename Command, typename... Args>
void addCommand(Args&&... args);
// 执行所有命令
void execute();
// 清除命令队列
void clear();
// 等待GPU完成
void waitForGPU();
private:
// 命令基类
class CommandBase {
public:
virtual ~CommandBase() = default;
virtual void execute() = 0;
};
// 具体命令模板
template<typename Func>
class Command : public CommandBase {
public:
Command(Func&& func) : m_func(std::forward<Func>(func)) {}
void execute() override { m_func(); }
private:
Func m_func;
};
// 命令队列
bx::RingBuffer<CommandBase*, 4096> m_commands;
// 线程同步
bx::Mutex m_mutex;
bx::ConditionVariable m_condition;
};
多线程渲染
/**
* 多线程渲染管理器
* 支持并行渲染和资源加载
*/
class MultiThreadedRenderer {
public:
MultiThreadedRenderer(uint32_t numWorkerThreads = 4);
~MultiThreadedRenderer();
// 提交渲染任务
void submitRenderTask(RenderTask&& task);
// 提交资源加载任务
void submitResourceTask(ResourceTask&& task);
// 等待所有任务完成
void waitForTasks();
// 获取渲染统计信息
const RenderStats& getStats() const;
private:
// 工作线程
class WorkerThread {
public:
WorkerThread(MultiThreadedRenderer* manager);
~WorkerThread();
void start();
void stop();
void addTask(Task&& task);
private:
void run();
MultiThreadedRenderer* m_manager;
bx::Thread m_thread;
bx::Mutex m_mutex;
bx::ConditionVariable m_condition;
std::vector<Task> m_tasks;
bool m_running;
};
// 任务队列
std::vector<std::unique_ptr<WorkerThread>> m_workers;
RenderStats m_stats;
// 任务分发
uint32_t m_nextWorker;
bx::Mutex m_statsMutex;
};
这些核心组件构成了bgfx的渲染系统,提供了从资源管理、着色器编译到多线程渲染的完整解决方案。每个组件都经过精心设计,确保在保持跨平台兼容性的同时提供最佳性能。 K9FMcC0novvzSyCLbwWAHjegrUYI4kC1G1nveAo+vbI=