这一节主要讲解集成一个bgfx到项目中
bgfx github 仓库地址

涉及的知识点,如下:

  1. 使用 xmake 构建工程, xmake 使用lua 不会可以简单的补一下语法
  2. 修复编译 bgfx 时报的错误
  3. 编译 shaderc 可执行文件
  4. 编译 glsl 到二进制, 因为bgfx 使用编译后的着色器代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
当前测试的版本
bgfx: commit id => c14ea22eee5866a580899027ef42b3867faa280c

bx: commit id => 7036e3d2d7f73513fc6bed25c969f2cb2818a884

bimg: commit id => dab021bc46dabba270123a32cc1c2f8102593e13

xmake: v2.2.5.201904012115

vs: VS2019

使用 cl 编译器

vscode: 1.36.1

系统: win10

时间: 2019年7月31日17:23:13

达到的效果

集成 glm, glfw, bgfx, bx, bimg 库到项目中, 并成功跑起来bgfx中第二个案例


可能会用到的链接地址

源码地址

库的作用 地址 描述
开源渲染库 https://github.com/bkaradzic/bgfx -
跨平台基础库 https://github.com/bkaradzic/bx -
Image 库 https://github.com/bkaradzic/bimg -
glm仓库地址 https://github.com/g-truc/glm -
glfw仓库地址 https://github.com/glfw/glfw -
bigg一个使用cmake集成bgfx, imgui, glfw, and glm. https://github.com/JoshuaBrookover/bigg 后面一个简单的框架参考与这个库
bgfx-minimal-example 简单的 helloworld 使用 bgfx https://github.com/jpcy/bgfx-minimal-example xmake的构建配置参考与它

参考博客地址

地址 描述
https://www.cnblogs.com/kileyi/p/8250919.html shader 的编译参考与这个博客
https://bkaradzic.github.io/bgfx/build.html bgfx 官方文档

编译这几个库

注意这里xmake.lua配置现在只能运行在windows

需要如下几个库

工程的分布图

最上面的基础配置

1
2
3
4
5
6
7
8
9
10
local BGFX_DIR = "deps/bgfx/"
local BX_DIR = "deps/bx/"
local BIMG_DIR = "deps/bimg/"
local GLFW_DIR = "deps/glfw-3.3/"
local GLM_DIR = "deps/glm"

set_project("vker")
set_version("0.0.1")

add_rules("mode.debug", "mode.release")

编译 bgfx 的xmake配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
target("bgfx")
set_kind("static")

set_targetdir("$(buildir)/libs")

add_defines("__STDC_LIMIT_MACROS"
, "__STDC_FORMAT_MACROS"
, "__STDC_CONSTANT_MACROS"
, "NDEBUG"
, "WIN32"
, "_WIN32"
, "_HAS_EXCEPTIONS=0"
, "_HAS_ITERATOR_DEBUGGING=0"
, "_ITERATOR_DEBUG_LEVEL=0"
, "_SCL_SECURE=0"
, "_SECURE_SCL=0"
, "_SCL_SECURE_NO_WARNINGS"
, "_CRT_SECURE_NO_WARNINGS"
, "_CRT_SECURE_NO_DEPRECATE")

if is_mode("debug") then
add_defines("BGFX_CONFIG_DEBUG=1")
end

add_includedirs(BGFX_DIR .. "include")
add_includedirs(BGFX_DIR .. "3rdparty")
add_includedirs(BGFX_DIR .. "3rdparty/dxsdk/include")
add_includedirs(BGFX_DIR .. "3rdparty/khronos")
add_includedirs(BX_DIR .. "include")
add_includedirs(BX_DIR .. "include/compat/msvc")
add_includedirs(BIMG_DIR .. "include")

-- default cl complier
add_files(BGFX_DIR .. "src/**.cpp|amalgamated.cpp") --|glcontext_glx.cpp|glcontext_egl.cpp
add_syslinks("user32", "gdi32")
  • 设置构建静态库
  • 设置构建静态库的路径
  • 添加预定义宏
  • 添加头文件的搜索路径
  • 添加源文件 并 过滤掉 amalgamated.cpp|glcontext_glx.cpp|glcontext_egl.cpp 这三个cpp文件 不会出现函数重定义问题
  • 依赖系统库 user32, gdi32

编译 bx 的xmake配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
set_kind("static")

set_targetdir("$(buildir)/libs")
add_defines("__STDC_LIMIT_MACROS"
, "__STDC_FORMAT_MACROS"
, "__STDC_CONSTANT_MACROS"
, "NDEBUG"
, "WIN32"
, "_WIN32"
, "_HAS_EXCEPTIONS=0"
, "_HAS_ITERATOR_DEBUGGING=0"
, "_ITERATOR_DEBUG_LEVEL=0"
, "_SCL_SECURE=0"
, "_SECURE_SCL=0"
, "_SCL_SECURE_NO_WARNINGS"
, "_CRT_SECURE_NO_WARNINGS"
, "_CRT_SECURE_NO_DEPRECATE")

add_includedirs(BX_DIR .. "include")
add_includedirs(BX_DIR .. "include/bx/inline")
add_includedirs(BX_DIR .. "include/compat/msvc")
add_includedirs(BX_DIR .. "3rdparty")

add_files(BX_DIR .. "src/**.cpp|amalgamated.cpp") --|crtnone.cpp
  • 设置构建静态库
  • 设置构建静态库的路径
  • 添加预定义宏
  • 添加头文件的搜索路径
  • 添加源文件 并 过滤掉 amalgamated.cpp|crtnone.cpp 这两个cpp文件 不会出现函数重定义问题

编译 bimg 的xmake配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
set_kind("static")

set_targetdir("$(buildir)/libs")

add_defines("__STDC_LIMIT_MACROS"
, "__STDC_FORMAT_MACROS"
, "__STDC_CONSTANT_MACROS"
, "NDEBUG"
, "WIN32"
, "_WIN32"
, "_HAS_EXCEPTIONS=0"
, "_HAS_ITERATOR_DEBUGGING=0"
, "_ITERATOR_DEBUG_LEVEL=0"
, "_SCL_SECURE=0"
, "_SECURE_SCL=0"
, "_SCL_SECURE_NO_WARNINGS"
, "_CRT_SECURE_NO_WARNINGS"
, "_CRT_SECURE_NO_DEPRECATE")

add_includedirs(BIMG_DIR .. "include")
add_includedirs(BIMG_DIR .. "3rdparty/astc-codec")
add_includedirs(BIMG_DIR .. "3rdparty/astc-codec/include")
add_includedirs(BX_DIR .. "include")
add_includedirs(BX_DIR .. "include/compat/msvc")

add_files(BIMG_DIR .. "src/image.cpp")
add_files(BIMG_DIR .. "src/image_gnf.cpp")
add_files(BIMG_DIR .. "3rdparty/astc-codec/src/decoder/*.cc")
  • 设置构建静态库
  • 设置构建静态库的路径
  • 添加预定义宏
  • 添加头文件的搜索路径
  • 添加源文件 并 过滤掉 amalgamated.cpp|glcontext_glx.cpp|glcontext_egl.cpp 这个三个cpp文件 不会出现函数重定义问题

编译 glfw 的xmake配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
target("glfw")
set_kind("static")

set_targetdir("$(buildir)/libs")
add_includedirs(GLFW_DIR .. "include")

add_files(GLFW_DIR .. "src/context.c")
add_files(GLFW_DIR .. "src/egl_context.c")
add_files(GLFW_DIR .. "src/init.c")
add_files(GLFW_DIR .. "src/input.c")
add_files(GLFW_DIR .. "src/monitor.c")
add_files(GLFW_DIR .. "src/osmesa_context.c")
add_files(GLFW_DIR .. "src/vulkan.c")
add_files(GLFW_DIR .. "src/window.c")

if is_plat("windows") then
add_defines("_GLFW_WIN32", "_CRT_SECURE_NO_WARNINGS", "_WIN64")

add_files(GLFW_DIR .. "src/win32_*.c")
add_files(GLFW_DIR .. "src/wgl_context.c")
elseif is_plat("linux") then
add_defines("_GLFW_X11")

add_files(GLFW_DIR .. "src/glx_context.c")
add_files(GLFW_DIR .. "src/linux*.c")
add_files(GLFW_DIR .. "src/posix*.c")
add_files(GLFW_DIR .. "src/x11*.c")
add_files(GLFW_DIR .. "src/xkb*.c")
end

add_syslinks("shell32")
  • 设置构建静态库
  • 设置构建静态库的路径
  • 添加预定义宏
  • 添加头文件的搜索路径
  • 根据平台添加相应的源文件
  • 依赖系统库 shell32

编译工程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
target("vkEngine")
add_deps("bgfx")
add_deps("bx")
add_deps("bimg")
add_deps("glfw")

set_kind("binary")

add_includedirs(BGFX_DIR .. "include")
add_includedirs(BGFX_DIR .. "3rdparty")
add_includedirs(BGFX_DIR .. "3rdparty/dxsdk/include")
add_includedirs(BGFX_DIR .. "3rdparty/khronos")
add_includedirs(BX_DIR .. "include")
add_includedirs(BX_DIR .. "include/compat/msvc")
add_includedirs(BIMG_DIR .. "include")
add_includedirs(GLFW_DIR .. "include")
add_includedirs(GLM_DIR)

add_includedirs("src/")

if is_mode("debug") then
add_linkdirs("$(buildir)/libs/debug")
add_links("glfw", "bgfx", "bx", "bimg")
elseif is_mode("release") then

end

-- 显示控制台方便打印输出
add_ldflags("/SUBSYSTEM:CONSOLE")

add_files("src/**.cpp")
  • 依赖前面那四个构建任务
  • 设置成可执行文件
  • 添加头文件搜索路径
  • 链接静态库
  • 设置链接 参数
  • 添加源文件

编译 Shaderc 工具

因为 bgfx 使用的 GLSL 是编译后的文件,他们也提供编译 你着色器代码的工具, 但是需要你自己编译

查看文档,生成官方的工程

构建VS工程
cd bgfx
..\bx\tools\bin\windows\genie –with-tools –with-shared-lib –with-examples vs2019

使用glfw的例子
cd bgfx
..\bx\tools\bin\windows\genie –with-tools –with-shared-lib –with-glfw –with-examples vs2019

使用sdl的例子
cd bgfx
..\bx\tools\bin\windows\genie –with-tools –with-shared-lib –with-sdl –with-examples vs2019

xcode 的构建例子也是样的

建议使用默认的构建工程 ,,, 也就是 不适用 glfw, 或者 sdl

然后你会看到

直接编译这些工程就会生成 5个可执行文件,, shder 编译(shderc) 模型编译(geometryc) 模型编译后查看器(geometryv) 纹理编译(texturec) 纹理编译后查看器(texturev)

编译 shader 到二进制

看他们的例子 每个shader 都会引用 bgfx_shader.sh 和 shaderlib.sh 两个文件

找到下面 shader.mk 文件

看下面的内容, 这些东西可以提示你怎么使用 shaderc 编译器

这个是他们shader编译器的帮助信息

windows opengl 命令

可以新建一个批处理执行下面的内容

1
2
3
4
shaderc -f ../examples/cubes/vs_cubes.sc -o ..\examples\cubes\shaders\glsl\vs_cubes.bin --platform windows -i ..\examples\cubes\ -p 120 --type vertex
shaderc -f ../examples/cubes/fs_cubes.sc -o ..\examples\cubes\shaders\glsl\fs_cubes.bin --platform windows -i ..\examples\cubes\ -p 120 --type fragment

pause

windows dx11 命令

1
2
3
4
shaderc -f ../examples/cubes/vs_cubes.sc -o ..\examples\cubes\shaders\dx11\vs_cubes.bin --platform windows -i ..\examples\cubes\ -p vs_5_0 --type vertex -O 3
shaderc -f ../examples/cubes/fs_cubes.sc -o ..\examples\cubes\shaders\dx11\fs_cubes.bin --platform windows -i ..\examples\cubes\ -p ps_5_0 --type fragment -O 3

pause

编译参数部分解释

–varyingdef 指定 varying.def.sc 至于这东西 只是规定, 后面再说.
-f 输入文件
-o 输出文件
–platform 编译平台
-i 要包含文件的路径
-p 这个参数是着色器的模式 主要参考 shader.mk 里面的参数做参考
–type 编译的类型
-O <0,1,2,3> DX9 或者 DX11 优化等级

编译好的可执行文件

我这里放上我编译好的 macosx平台 Release 版的工具
里面包含 geometryc geometryv texturec texturev shaderc

下载地址

ending

这里我就不放代码了,,, 需要你们自己动手去做,,, 我可以把构建配置发给你们
我也只是用了一点, 后面会继续深入,,, 大家一块学习,,, 讨论交流.
这个官方的文档比较的少, 不全面, 需要自己多看看他们的例子和源码.

xmake.lua 配置
xmake.lua

最后更新: 2019年09月14日 20:59

原始链接: https://leng521.top/posts/ea56194d/