找到驱动切换的代码,自然而然就要找实现的位置了,简单搜了下,原来是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. 3-hive、sqoop

    1.HIVE 1.交互命令 use db_name; create database db_name //创建数据库 create database if not exists db_name //创 ...

  2. http stream

    http stream 博客分类: http://canofy.iteye.com/blog/2097876 j2EE   StringBuilder sb = new StringBuilder() ...

  3. .NET项目中使用PostSharp

    PostSharp是一种Aspect Oriented Programming 面向切面(或面向方面)的组件框架,适用在.NET开发中,本篇主要介绍Postsharp在.NET开发中的相关知识,以及一 ...

  4. leetcode979

    搞不定这种递归计算,可能我的头脑是“线性”的,这种一层一层的,想起来太费劲了,想的头发都没了.以后希望能有AI来写这种程序吧,AI不怕掉头发! class Solution(object): def ...

  5. mongo 副本集

    副本集配置文件 dbpath=/hwdata/mongodb/datalogpath=/hwdata/mongodb/logs/master.logpidfilepath=/hwdata/mongod ...

  6. django admin 设置(转载https://www.cnblogs.com/wumingxiaoyao/p/6928297.html)

    Django admin 一些有用的设置   Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...

  7. docker mysql Exit 1

    用laradock启动mysql时,state总是 Exit 1 ,docker-compose build后也没有效果 这时应该在-/.laradock/data(.env的DATA_PATH_HO ...

  8. javascript隐式原型

    上图是js原型关系图. javascript是一种基于对象的编程语言,但它与一般面向对象的编程语言不同,因为它没有class类的概念 什么是原型?? 我们每创建一个函数,它就会自带一个原型函数,这个原 ...

  9. Beta冲刺——第一天

    beta冲刺:第一天 各个成员今日完成的任务 成员 冯晓.马思远 彭辉.王爽 吴琼.郝延婷 今日完成任务 ·参会人员注册代码规范与功能测试 ·网站的前端代码调整 ·代码规范 ·系统功能测试 ·博客撰写 ...

  10. sonar gitlab+jenkins配置

    sonar.projectKey=test-news-activitysonar.projectName=test-news-activitysonar.projectVersion=$BUILD_N ...