BGFX学习笔记01

BGFX是什么

BGFX是一个专注渲染接口的项目,而我打算做一个跨平台游戏引擎,渲染是引擎很基础的功能,BGFX可以提供最基本的渲染API。

BGFX在基本的设计倾向上,还是类似opengl这种设置状态机,呼叫Draw指令的设计。

但是多设置了一些概念,还是有一些学习成本的

BGFX不是一个引擎,但他为开发一个跨平台引擎节省了很多工作。

BGFX的一些特点

1. 首先BGFX所有的操作都是入队列的,这样可以很轻易的做到commandbuffer 多线程。直到调用BGFX.frame();会等待绘制

2. Bgfx并非完全严格按照gl设计,Commit指令相当于Draw,但是Clear指令只是设置一个状态,不会在队列里做出对应指令,这个clear状态在每个view绘制 开始时实际做clear的动作。

3. 这里就涉及一个新概念View了,Bgfx封装了帧的概念,帧好理解,Bgfx::frame()等待一帧,一帧就是你要画点啥到屏幕上,一帧被分为若干个view,bgfx默认最大65536个view。一个view就是一堆绘制指令,一帧顺序执行所有的view,每个view的开头都是一个clear,每个view可以使用不同的目标,输出到屏幕,或者输出到rendertarget。

4. Bgfx 采用了一个很巧妙的设计实现了shader的跨平台,之前我没有好好看bgfx的实现,直接跑去看spirvcross 这类方案了,草率了。仔细一看,bgfx自己就带了shaderc,可以自己编译多个平台的shader。而且BGFX的实现方法就是替换,很巧妙很简单的。

谈谈BGFX的新概念VIEW

BGFX的新概念view 会带来一些不同的用法,我们过去做渲染没有这样的概念,通常管线直接来管理这些工作,所以场景和UI的结合就管线直接管了,画UI的时候ClearDepthOnly就可以了。但是BGFX clear的时机只有view开始时,所以对于BGFX,你必须把场景放入一个View,UI放入另一个View,然后都准备好,执行一次Bgfx::frame()等他画出来。

设计始终是一把双刃剑,概念更清晰,同时也更复杂。BGFX 这个VIEW的设计,带来一点额外的学习成本,但是把绘图工作需要多次操作,最终合成出一个最终的帧的这个操作。分的更加清晰了,我认为还是比较优秀的设计。

按照BGFX的view设计,如果你的场景里有一个电视看着另一个场景,BGFX就应该0号view画场景2,输出到rt,1号view画创景1,2号view画UI。RenderTarget和 UI都应该被合并到一起,一起来Bgfx.Frame();

谈谈BGFX的跨平台Shader

BGFX的shader 跨平台方案基本上是基于GLSL,但是很多指令都改了一下,这样在编译成不同版本的Shader时,只需要进行替换,这也带来一些小问题,就是这玩意不是严格的glsl了。

首先BGFX编译Shader需要一个varying.def.sc 文件(可以指定名字,不指定默认会找这个)

BGFX学习笔记01

他负责的就是glsl语法中 vraying 和 attribute 定义,可以看出虽然改了语法,还是熟悉的味道。

然后是vertexshader

BGFX学习笔记01

可以看到bgfx这里加了个自己的新玩法

$input 用来配置attribute

$output 用来配置 varying 和上边的配置文件统一

bgfx_shader.sh 里就是一堆宏了,这个一看就懂。

Fragment shader

BGFX学习笔记01

Fragment shader 的input 是 varying

这里的SAMPLER2D 要用宏来定义,因为他在hlsl 和 glsl 相差很大,bgfx选择用宏来搞定差别

采样函数换成了texture2D也是基于上述原因

编译bgfx tool 可以得到shaderc 命令行工具,你需要的所有文件,bgfx源码里都有。

看一下我的批处理,你能感受到他的跨平台效果了吗?

BGFX学习笔记01

谈谈BGFX可能的一些问题

Bgfx把三矩阵放进了一些深层逻辑

BGFX学习笔记01

默认定义了这些uniform,并且会自己对提交的内容进行深度排序(这肯定依赖ModelViewProj)

这也多管了一些引擎该管的事情,也导致使用上需要更注意。

可能透明和不透明物体也得分view 来绘制了,我还没实践这些,但是从接口上看,BGFX只允许对View设置排序模式。

BGFX学习笔记01

面对一打有不同排序要求的绘制任务,不同Clear要求的绘制任务,不同RT要求的绘制任务,BGFX开出的药方都是同一个,放进不同的View里。

既然有人帮你做了这么多了,你还有什么接口,不做个引擎呢。

BGFX学习笔记01

附图一张,慢慢努力。

上一篇:使用C#中的XSD字符串验证XmlDocument?


下一篇:C# 读取XML文本内容