• 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 文件(可以指定名字,不指定默认会找这个)

    wps1

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

    然后是vertexshader

    wps2

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

    $input 用来配置attribute

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

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

    Fragment shader

    wps3

    Fragment shader 的input 是 varying

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

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

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

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

    wps4

    谈谈BGFX可能的一些问题

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

    wps5

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

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

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

    wps6

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

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

    wps7

    附图一张,慢慢努力。

  • 相关阅读:
    [转]深入探析c# Socket
    [转]软件架构师书籍
    常指针类型讲解(const int *p,int*const p,int const *p,指针常量,常量指针)
    使用CreateFile()打开COM10及以上串口的问题[转并整理]
    如何在MFC中打开控制台[转]
    vb.net相关的除法运算
    计算机如何表示小数
    精简指令集与复杂指令集
    【转】ArcSDE数据被锁定后的解锁方法
    [ERR0134] Requested Service is not available【转载】
  • 原文地址:https://www.cnblogs.com/crazylights/p/13555816.html
Copyright © 2020-2023  润新知