找到驱动切换的代码,自然而然就要找实现的位置了,简单搜了下,原来是GLSL Shader字节码转换到HLSL字节码,正好和Klayge做了相反的工作。

时间上似乎也差不多,Klyage是2014年搞的

http://www.klayge.org/2014/03/25/announces-dxbc2glsl-a-hlsl-bytecode-to-glsl-compiler/

bgfx最老的一个文件.gitattributes显示是3年前,现在是2018年1月,3年前2015年1月或更早,双方谁都没提到过对面,看起来似乎是平行世界。

要么就是当年流行这种东西?不得而知。反正重要是来看看大概是什么位置实现的。

顺便bgfx这代码量也不小,虽然只能算是个图形API封装,达不到游戏引擎级别,但是看到一堆线程,信号啥的直接就想跪了,没这方面基础果然看不习惯。

再顺便,看bgfx这趋势和代码量,似乎有望成为下一个SDL,SFML,加个音频的话我真就用他了...

分析思路是这样的,首先看第1个例子cubes,因为第0个例子只是演示了imgui和自带的debug文本,没什么shader方面的参考价值。

cubes.cpp,128行找到

m_program = loadProgram("vs_cubes", "fs_cubes");

一路跟进,来到bgfx_utils.cpp,99行

static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const char* _name)

这个函数里面有关于DX还是OpenGL的switch分支判定。

但是继续跟却找不到什么头绪了。

接着从bgfx的src文件名看。

发现在renderer下面有shader.cpp,shader_dxbc.cpp等,在DX驱动模式下,

shader_dxbc.cpp的555行看到

int32_t readString(bx::ReaderSeekerI* _reader, int64_t _offset, char* _out, uint32_t _max, bx::Error* _err)

下断点,成功断下来,换到Opengl下无效,可以判断此处应为DX转换代码,顺便BC应该是Byte Code的意思。

之后在堆栈里向上找,找到一处多态调用bgfx.cpp,2405行

case CommandBuffer::CreateShader:

这个分支下面有一句

m_renderCtx->createShader(handle, mem);

就是这里做了多态处理。

继续跟可以发现,如果是OGL,就直接在renderer_gl.cpp中做

m_id = glCreateShader(m_type);

建立GL Shader

如果是DX,从字节码判定,然后在renderer_d3d11.cpp中

CreateVertexShader

CreatePixelShader

CreateComputeShader

之后可能要看看nbody是怎么实现的,话说回来, bgfx也算学习OpenGL Compute Shader的资料了,因为OpenGL这方面的资料实在太少,完全不能打。

DX好歹有个SDK例子和龙书,OpenGL就没看到什么太靠谱的例子。Geometry Shader的例子到是有,做GPU粒子的看过几个也实现了,CS的是真没见过。

顺便发现bgfx只有VS,PS,CS,顶点,像素和计算着色器3种,没有Geometry Shader的实现,不知道是什么原因没实现,但是总给我一种三缺一的不爽,虽然CS,GS很少用,大部分情况只要有VS,PS就够了。

bgfx入门练习2——找出DX,OpenGL驱动切换实现原理的更多相关文章

  1. 【一起学源码-微服务】Ribbon 源码二:通过Debug找出Ribbon初始化流程及ILoadBalancer原理分析

    前言 前情回顾 上一讲讲了Ribbon的基础知识,通过一个简单的demo看了下Ribbon的负载均衡,我们在RestTemplate上加了@LoadBalanced注解后,就能够自动的负载均衡了. 本 ...

  2. bgfx入门练习1——切换图形API驱动模式DX与OpenGL

    翻了下上次编译bgfx是去年2月份的事了,最近正好想试试DX,OpenGL双驱动,看Urho3D和Klayge光封装就头痛,人又懒,写OpenGL时也基本glfw,于是想到bgfx,不如再试试. 发现 ...

  3. 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。

    题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小. 源码如下: #include <iostream> #include <string.h> #incl ...

  4. bgfx入门练习3——编译自定义Shader

    马个鸡,总算编译过了自定义Shader,在此感谢自己,感谢自己,以及感谢自己.没有自己的努力,我是不可能解决这个问题的,自己真是太叼了.妈的智障!!! 管方那屎一样的make工具根本没用,反正我是折腾 ...

  5. HDU——3786找出直系亲属(DFS+回溯)

    找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  6. 我用 Python 找出了删除我微信的所有人并将他们自动化删除了

    1. 概述 不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟)之后,缓缓拿出了手机,打开微信,找 ...

  7. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  8. 使用T-SQL找出执行时间过长的作业

        有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , ...

  9. [LeetCode] Find All Numbers Disappeared in an Array 找出数组中所有消失的数字

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

随机推荐

  1. 7、Curator的常规操作

    package com.ourteam; import org.apache.curator.RetryPolicy;import org.apache.curator.framework.Curat ...

  2. js运算符逻辑!和instanceof的优先级

    写js时间长了,运算符优先级很可能自然而然的就形成习惯了,也不需要特别注意优先级的问题. 至少到目前为止,我也没有真正了解过js当中所有运算符的具体优先级.也没有出过什么重大的问题. 但是直到今天,在 ...

  3. TCP‘三次握手’和‘四次挥手’(通俗易懂)

      概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通 ...

  4. android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)

    package net.yt.yuncare.widgets; import android.graphics.Bitmap; import android.graphics.Canvas; impo ...

  5. python基础之从认识python到python的使用

    python的历史: python的创始人是吉多·范罗苏姆(Guido van Rossum),人称“龟叔”,1989年圣诞节期间,Guido开始写Python语言的编译器.他希望这个叫做Python ...

  6. log4j配置后行号乱码显示为?问号

    debug="true"  classpathref="accrual.path" > 首发于 http://blog.xfuse.cn 参考文档 htt ...

  7. leetcode739

    class Solution(object): def dailyTemperatures(self, T: 'List[int]') -> 'List[int]': S = list() n ...

  8. 【转】完整精确导入Kernel与Uboot参与编译了的代码到Source Insight,Understand, SlickEdit

    The linux kernel and u-boot contains lots of files, when we want to broswe the source code,we just w ...

  9. 31_NavLink组件包装优化

    简单理解为自定义一个组件并自带样式 import React, {Component} from 'react' import {Switch, Route, Redirect} from 'reac ...

  10. Mybatis-PageHelper分页插件

    PageHelper.startPage 静态方法调用 除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法. 在你需要进行分页 ...