bgfx从入门到没有放弃

公司最近要跨平台做一些渲染图像处理,android要用opengl,
未来要升级vulkan,(貌似bgfx新版已经支持vulkan了)ios要用metal,
为了避免使用两套代码,没办法,调研到最后,bgfx满足,
且大神持续开发,国内的牛人“云风”也在更新,但是这玩意资料太少太少了,
而且我们用过程中遇到有些很挫的bug,但是好多已经改了。入坑需谨慎。

bgfx总结

创建时间:2018年10月22日 version: 1.0

1. 什么是 bgfx:

Cross-platform, graphics API agnostic, “Bring Your Own Engine/Framework” 
style rendering library, licensed under permissive BSD-2 clause open source license.

2. 支持的渲染引擎及平台

Direct3D 9
Direct3D 11
Direct3D 12
Metal
OpenGL 2.1
OpenGL 3.1+
OpenGL ES 2
OpenGL ES 3.1
WebGL 1.0
WebGL 2.0

==暂时不支持 vulkan==

Android (14+, ARM, x86, MIPS)
asm.js/Emscripten (1.25.0)
FreeBSD
iOS (iPhone, iPad, AppleTV)
Linux
MIPS Creator CI20
OSX (10.12+)
RaspberryPi
SteamLink
Windows (XP, Vista, 7, 8, 10)
WinRT (WinPhone 8.0+)

3. 工程依赖

[编译文档地址](https://bkaradzic.github.io/bgfx/build.html)

依赖 bx、bimg、bgfx 三个工程
https://github.com/bkaradzic/bgfx
https://github.com/bkaradzic/bx
https://github.com/bkaradzic/bimg

4.编译:

Xcode 编译:

cd bgfx
Xcode command line:
make osx-release64
cd examples/runtime
../../.build/osx64_clang/bin/examples.app/Contents/MacOS/examplesRelease

编译结果在 ../bgfx/.build/osx64_clang/bin,里面包含了各种静态库和工具.

5.流程:

下面介绍一个使用 FBO 渲染纹理,并显示到屏幕上的例子

步骤如下:
5.1 初始化渲染平台信息
5.2 初始化 bgfx 资源
5.3 设置顶点坐标,纹理坐标
5.4 设置清屏色
5.5 加载纹理,shader,组装成 program
5.6 创建 FBO,绑定纹理
5.7 渲染 FBO
5.8 渲染 FBO 结果纹理到屏幕
5.9 销毁资源
5.10 销毁 bgfx
5.1 初始化渲染平台信息
首先要理解个问题,假设 bgfx 默认是使用的 OpenGL ES 来实现渲染的话,那么上层的 view 是如何与底
层的 Egl 绑定在一起的?要回答这个问题,我们得知道,OpenGL最终的渲染,都是渲染在一个 EGLSurface 中,这个 EGLSurface 的创建方式如下

EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);

其中第三个参数 EGLNativeWindowType 就是和上层 view 挂钩的,

对于 Android 平台来说,不管上层用 NativeActity,还是 GlSurfaceView 还是 SurfaceView,都需要一个代表屏幕渲染缓冲区的类 surface 来创建一个 NativeWindow(EGLNativeWindowType),然后绑定到 EGLSurface 中。

    // surface 来自于上层
    ANativeWindow *mWindow  = ANativeWindow_fromSurface(env, surface);
    bgfx::PlatformData pd;
    pd.ndt = NULL;
    pd.nwh = mWindow;
    pd.context = NULL;
    pd.backBuffer = NULL;
    pd.backBufferDS = NULL;
    bgfx::setPlatformData(pd); // 设置平台信息,绑定上层 view

对于 iOS 平台来说,最终渲染都需要使用到 UIView 的 CALayer,如果是使用 OpengGL 则返回 CAEAGLLayer,如果是使用 Metal 则返回 CAMetalLayer,而与 Android 相同需要构造 PlatformData,区别在于 pd.nwh 在 iOS 下需要传 CAEAGLLayer 或者 CAMetalLayer。

关于 PlatformData 的说明如下
	// Platform data.
	//
	// @attention C99 equivalent is `bgfx_platform_data_t`.
	//
	struct PlatformData
	{
		void* ndt;          //!< Native display type.
		void* nwh;          //!< Native window handle.
		void* context;      //!< GL context, or D3D device.
		void* backBuffer;   //!< GL backbuffer, or D3D render target view.
		void* backBufferDS; //!< Backbuffer depth/stencil.
		void* session;      //!< ovrSession, for Oculus SDK
	};

5.2 初始化bgfx资源
    bgfx::Init init;
    // 选择一个渲染后端,当设置为 RendererType::Enum::Count 的时候,系统将默认选择一个平台,可以设置 Metal,OpenGL ES,Direct 等
    init.type = bgfx::RendererType::Enum::Count;
    // 设置供应商接口Vendor PCI ID,默认设置为0将选择第一个设备来显示。
    // #define BGFX_PCI_ID_NONE                UINT16_C(0x0000) //!< Autoselect adapter.
    // #define BGFX_PCI_ID_SOFTWARE_RASTERIZER UINT16_C(0x0001) //!< Software rasterizer.
    // #define BGFX_PCI_ID_AMD                 UINT16_C(0x1002) //!< AMD adapter.
    // #define BGFX_PCI_ID_INTEL               UINT16_C(0x8086) //!< Intel adapter.
    // #define BGFX_PCI_ID_NVIDIA              UINT16_C(0x10de) //!< nVidia adapter.
    init.vendorId = 0;
    init.resolution.width = m_width;
    init.resolution.height = m_height;
    // BGFX_RESET_VSYNC 其作用主要是让显卡的运算和显示器刷新率一致以稳定输出的画面质量。
    init.resolution.reset = m_reset;
    bgfx::init(init);
    
5.3 设置顶点坐标,纹理坐标
// 封装顶点对象
struct PosColorVertex {
    // 顶点坐标
    float m_x;
    float m_y;
    float m_z;
    // 纹理坐标
    int16_t m_u;
    int16_t m_v;
    // 顶点描述对象
    static bgfx::VertexDecl ms_decl;

    static void init() {
        // 这句话的意思是位置数据里面,前三个 Float 类型是作为顶点坐标,后两个 Int16 类的值作为纹理的坐标
        ms_decl
	      .begin()
	      .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
	      .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Int16, true)
	      .end();
    };
};
// 这个地方要注意了,此时 FBO 的纹理坐标 Android 和 iOS 都是采用左下角作为纹理坐标原点,
// iOS 或者 Mac 平台在渲染的时候,也是使用同样的坐标来渲染,但是 Android 平台不一样,
// Android 平台在渲染纹理的时候,是采用左上角作为纹理坐标来渲染的,
// 所以对于 Android 平台来说,下面还需要一个渲染的坐标 s_Android_render_Vertices1

static PosColorVertex s_fbo_Vertices[] =
        {
                {-1.0f,  1.0f,  0.0f,      0, 0x7fff},
                { 1.0f,  1.0f,  0.0f, 0x7fff, 0x7fff},
                {-1.0f, -1.0f,  0.0f,      0,      0},
                { 1.0f, -1.0f,  0.0f, 0x7fff,      0},
        };

// Android 平台渲染的坐标和纹理顶点,左上角为纹理原点
static PosColorVertex s_Android_render_Vertices1[] =
        {
                {-1.0f,  1.0f,  0.0f,      0,      0},
                { 1.0f,  1.0f,  0.0f, 0x7fff,      0},
                {-1.0f, -1.0f,  0.0f,      0, 0x7fff},
                { 1.0f, -1.0f,  0.0f, 0x7fff, 0x7fff},
        };

// 顶点绘制顺序
static const uint16_t s_TriList[] =
        {
                0, 2, 1,
                1, 2, 3,
        };

5.4 设置清屏色
    // 设置清屏色,0或者1或者其他数据代表 view_id 的编号,这个view内部是个结构体,它封装了一个渲染的范围,清屏色,FBO 等等参数,用作最后渲染框架渲染的时候用
    bgfx::setViewClear(0
            , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
            , 0xffffffff
            , 1.0f
            , 0
    );
    bgfx::setViewClear(1
            , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
            , 0xffffffff
            , 1.0f
            , 0
    );
5.5 加载纹理,shader,组装成 program
    // FBO 顶点缓冲区 Handle
    bgfx::VertexBufferHandle m_vbh;
    // Android 渲染顶点缓冲区 Handle
    bgfx::VertexBufferHandle m_vbh_Android_render;
    // 顶点绘制顺序缓冲 Handle
    bgfx::IndexBufferHandle m_ibh;

    // FBO 处理纹理效果相关 program
    bgfx::ProgramHandle m_program;
    // 输入纹理,用作 FBO 处理效果
    bgfx::TextureHandle m_texture;
    // 纹理 handle
    bgfx::UniformHandle s_textureHandle;

    // 用于显示的 program
    bgfx::ProgramHandle m_display_program;
    // 用于显示的纹理,此时来自于 FBO 的结果
    bgfx::UniformHandle s_display_tex_Handle;
    
    
     // Create static vertex buffer.
    m_vbh = bgfx::createVertexBuffer(
            // Static data can be passed with bgfx::makeRef
            bgfx::makeRef(s_fbo_Vertices, sizeof(s_fbo_Vertices)), ms_decl
    );

    // Create static vertex buffer.
    m_vbh_Android_render = bgfx::createVertexBuffer(
            // Static data can be passed with bgfx::makeRef
            bgfx::makeRef(s_Android_render_Vertices1, sizeof(s_Android_render_Vertices1)), ms_decl
    );

    // Create static index buffer for triangle strip rendering.
    m_ibh = bgfx::createIndexBuffer(
            // Static data can be passed with bgfx::makeRef
            bgfx::makeRef(s_TriList, sizeof(s_TriList))
    );

    // 从 shader 创建 program
    m_program = loadProgram("vs_cubes", "fs_cubes");
    // shader的uniform
    s_textureHandle = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1);
    // 创建纹理
    m_texture = loadTexture("/sdcard/test04.jpg");

    // 创建显示的 program
    m_display_program = loadProgram("vs_cubes", "display_fs_cubes");
    // 显示 program 中待传入的纹理
    s_display_tex_Handle = bgfx::createUniform("display_texColor", bgfx::UniformType::Int1);
    
5.6 创建FBO,绑定纹理
    // 切记 bgfx 的 FBO 初始化要定义成BGFX_INVALID_HANDLE,不然要被坑
    bgfx::FrameBufferHandle m_fbh = BGFX_INVALID_HANDLE,;
    // 不设置成BGFX_INVALID_HANDLE的话,这里第一次上来,isValid就会返回true
    if (!bgfx::isValid(m_fbh))
    {
        m_fbh = bgfx::createFrameBuffer((uint16_t)m_width, (uint16_t)m_height, bgfx::TextureFormat::Enum::BGRA8);
    }

5.7 渲染FBO
    // 设置渲染窗口大小
    bgfx::setViewRect(0, 0, 0, uint16_t(m_width), uint16_t(m_height));
    // 绑定 FBO 到 View_Id 为0的这个 View 上,开始渲染,渲染开始是 submit 方法调用后。
    bgfx::setViewFrameBuffer(0, m_fbh);
    bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
    // 设置 FBO 需要的输入纹理
    bgfx::setTexture(0, s_textureHandle, m_texture);
    bgfx::submit(0, m_program);

5.8 渲染 FBO 结果纹理到屏幕
    // 渲染到屏幕的 view 需要主动将该 view 的 FBO 设置为 invalid,然后从 FBO 中拿出 attach 的纹理,设置到这次渲染需要的输入参数中,然后显示
    bgfx::setVertexBuffer(0, m_vbh_Android_render);
    bgfx::setIndexBuffer(ibh);
    bgfx::setViewRect(1, 0, 0, uint16_t(m_width), uint16_t(m_height) );
    bgfx::setViewFrameBuffer(1, BGFX_INVALID_HANDLE);
    bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
    bgfx::setTexture(1, s_display_tex_Handle, bgfx::getTexture(m_fbh));
    bgfx::submit(1, m_display_program);
    
    // 显示到屏幕
    bgfx::frame();
5.9 销毁资源
    bgfx::destroy(m_ibh);
    bgfx::destroy(m_vbh);
    bgfx::destroy(m_program);
    bgfx::destroy(m_texture);
    bgfx::destroy(s_textureHandle);
    bgfx::destroy(s_display_tex_Handle);
5.10 销毁 bgfx
bgfx::shutdown();

6.完整Demo如下:

6.1 ExampleFBO.h
//
// Created by robin on 2018/10/17.
//

#ifndef NATIVE_ACTIVITY_EXAMPLECUBES_H
#define NATIVE_ACTIVITY_EXAMPLECUBES_H


#include "common.h"
#include "bgfx_utils.h"
#include "imgui/imgui.h"
#include "bgfx/platform.h"

struct PosColorVertex {
    float m_x;
    float m_y;
    float m_z;
    int16_t m_u;
    int16_t m_v;
};

static PosColorVertex s_cubeVertices[] =
        {
                {-1.0f,  1.0f,  0.0f,      0, 0x7fff},
                { 1.0f,  1.0f,  0.0f, 0x7fff, 0x7fff},
                {-1.0f, -1.0f,  0.0f,      0,      0},
                { 1.0f, -1.0f,  0.0f, 0x7fff,      0},
        };

static PosColorVertex s_cubeVertices1[] =
        {
                {-1.0f,  1.0f,  0.0f,      0,      0},
                { 1.0f,  1.0f,  0.0f, 0x7fff,      0},
                {-1.0f, -1.0f,  0.0f,      0, 0x7fff},
                { 1.0f, -1.0f,  0.0f, 0x7fff, 0x7fff},
        };

static const uint16_t s_cubeTriList[] =
        {
                0, 2, 1,
                1, 2, 3,
        };


class ExampleFBO : public entry::AppI {


public:
    uint32_t m_width;
    uint32_t m_height;
    uint32_t m_debug;
    uint32_t m_reset;
    bgfx::VertexBufferHandle m_vbh;
    bgfx::VertexBufferHandle m_vbh_Android_render;
    bgfx::IndexBufferHandle m_ibh;
    bgfx::VertexDecl ms_decl;
    int32_t m_pt;

    bgfx::ProgramHandle m_program;
    bgfx::TextureHandle m_texture;
    bgfx::UniformHandle s_textureHandle;

    bgfx::ProgramHandle m_display_program;
    bgfx::UniformHandle s_display_tex_Handle;
    bgfx::FrameBufferHandle m_fbh = BGFX_INVALID_HANDLE;

    bool m_r;
    bool m_g;
    bool m_b;
    bool m_a;


public:
    ExampleFBO(const char *_name1, const char *_description1);

    ///
    void init(int32_t _argc, const char *const *_argv, uint32_t _width, uint32_t _height);

    ///
    int shutdown();

    ///
    bool update();
};


#endif //NATIVE_ACTIVITY_EXAMPLECUBES_H

6.2 ExampleFBO.cpp

//
// Created by robin on 2018/10/17.
//

#include "ExampleFBO.h"

ExampleFBO::ExampleFBO(const char *_name1, const char *_description1) : AppI(_name1,
                                                                             _description1),
                                                                        m_pt(0), m_r(true),
                                                                        m_g(true), m_b(true),
                                                                        m_a(true) {
}


void
ExampleFBO::init(int32_t _argc, const char *const *_argv, uint32_t _width, uint32_t _height) {
    m_width = _width;
    m_height = _height;
    m_debug = BGFX_DEBUG_NONE;
    m_reset = BGFX_RESET_VSYNC;
    bgfx::Init init;
    init.type = bgfx::RendererType::Enum::Count;
    init.vendorId = 0;
    init.resolution.width = m_width;
    init.resolution.height = m_height;
    init.resolution.reset = m_reset;
    bgfx::init(init);

    // Enable debug text.
    bgfx::setDebug(m_debug);

    // Set view 0 clear state.
    bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0xffffffff, 1.0f, 0
    );
    bgfx::setViewClear(1, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0xffffffff, 1.0f, 0
    );

    // Create vertex stream declaration.
    ms_decl
            .begin()
            .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
            .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Int16, true)
            .end();

    // Create static vertex buffer.
    m_vbh = bgfx::createVertexBuffer(
            // Static data can be passed with bgfx::makeRef
            bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices)), ms_decl
    );

    // Create static vertex buffer.
    m_vbh_Android_render = bgfx::createVertexBuffer(
            // Static data can be passed with bgfx::makeRef
            bgfx::makeRef(s_cubeVertices1, sizeof(s_cubeVertices1)), ms_decl
    );

    // Create static index buffer for triangle strip rendering.
    m_ibh = bgfx::createIndexBuffer(
            // Static data can be passed with bgfx::makeRef
            bgfx::makeRef(s_cubeTriList, sizeof(s_cubeTriList))
    );

    // Create program from shaders.
    m_program = loadProgram("vs_cubes", "fs_cubes");
    s_textureHandle = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1);
    // Create program from shaders.
    m_texture = loadTexture("/sdcard/test04.jpg");


    m_display_program = loadProgram("vs_cubes", "display_fs_cubes");
    s_display_tex_Handle = bgfx::createUniform("display_texColor", bgfx::UniformType::Int1);

    imguiCreate();
}

int ExampleFBO::shutdown() {
    imguiDestroy();

    // Cleanup.
    bgfx::destroy(m_ibh);

    bgfx::destroy(m_vbh);
    bgfx::destroy(m_program);
    bgfx::destroy(m_texture);
    bgfx::destroy(s_textureHandle);
    // Shutdown bgfx.
    bgfx::shutdown();

    return 0;
}

bool ExampleFBO::update() {
    bgfx::IndexBufferHandle ibh = m_ibh;

    bgfx::touch(0);
    bgfx::setVertexBuffer(0, m_vbh);
    bgfx::setIndexBuffer(ibh);

    // OffScreen Renderer
    if (!bgfx::isValid(m_fbh)) {
        m_fbh = bgfx::createFrameBuffer((uint16_t) m_width, (uint16_t) m_height, bgfx::TextureFormat::Enum::BGRA8);
    }
    bgfx::setViewRect(0, 0, 0, uint16_t(m_width), uint16_t(m_height));
    bgfx::setViewFrameBuffer(0, m_fbh);
    bgfx::setState(BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A);
    bgfx::setTexture(0, s_textureHandle, m_texture);
    bgfx::submit(0, m_program);
	// Screen Renderer
    bgfx::setVertexBuffer(0, m_vbh_Android_render);
    bgfx::setIndexBuffer(ibh);
    bgfx::setViewRect(1, 0, 0, uint16_t(m_width), uint16_t(m_height));
    bgfx::setViewFrameBuffer(1, BGFX_INVALID_HANDLE);
    bgfx::setState(BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A);
    bgfx::setTexture(1, s_display_tex_Handle, bgfx::getTexture(m_fbh));
    bgfx::submit(1, m_display_program);

    bgfx::frame();
    return true;
}

6.3 display_fs_cubes.sc
$input v_texcoord0

/*
 * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
 * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
 */

#include "../common/common.sh"

SAMPLER2D(display_texColor, 0);

void main()
{
		gl_FragColor = vec4(texture2D(display_texColor, v_texcoord0).rgb, 1.0);
}

6.4 vs_cubes.sc
$input a_position, a_texcoord0
$output v_texcoord0

/*
 * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
 * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
 */

#include "../common/common.sh"

void main()
{
	gl_Position = vec4(a_position, 1.0);
	v_texcoord0 = a_texcoord0;
}

6.5 varying_def.sc
vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0);

vec3 a_position  : POSITION;
vec2 a_texcoord0 : TEXCOORD0;

6.6 fs_cubes.sc
$input v_texcoord0

/*
 * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
 * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
 */

#include "../common/common.sh"

SAMPLER2D(s_texColor, 0);

void main()
{
	if (v_texcoord0.x > 0.5)
	{
		vec4 color = vec4(texture2D(s_texColor, v_texcoord0).rgb, 1.0);
		float gray = color.r*0.299 + color.g*0.587 + color.b*0.114;
		gl_FragColor = vec4(gray, gray, gray, color.a);
	}
	else
	{
		gl_FragColor = vec4(texture2D(s_texColor, v_texcoord0).rgb, 1.0);
	}
}

7.补充

7.1 shader 语法及例子:
bgfx cross-platform shader language is based on GLSL syntax. It’s uses ANSI C preprocessor to transform GLSL like language syntax into HLSL. This technique has certain drawbacks, but overall it’s simple and allows quick authoring of cross-platform shaders.

Some differences between bgfx’s shaderc flavor of GLSL and regular GLSL:

No bool/int uniforms, all uniforms must be float.
Attributes and varyings can be accessed only from main() function.
Must use SAMPLER2D/3D/CUBE/etc. macros instead of sampler2D/3D/Cube/etc. tokens.
Must use vec2/3/4_splat(<value>) instead of vec2/3/4(<value>).
Must use mul(x, y) when multiplying vectors and matrices.
Must use varying.def.sc to define input/output semantic and precission instead of using attribute/in and varying/in/out.
$input/$output tokens must appear at the begining of shader.

7.2 顶点
$input a_position, a_color0
$output v_color0

/*
 * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
 * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
 */

#include "../common/common.sh"

void main()
{
	gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) );
	v_color0 = a_color0;
}


注意,顶点 shader 属性的定义必须按照 bgfx 的关键字来,譬如你使用 Color0,那么 shade r里面输入参数就要是 a_color0

列举如下:
	struct Attrib
	{
		/// Corresponds to vertex shader attribute.
		enum Enum
		{
			Position,  //!< a_position
			Normal,    //!< a_normal
			Tangent,   //!< a_tangent
			Bitangent, //!< a_bitangent
			Color0,    //!< a_color0
			Color1,    //!< a_color1
			Color2,    //!< a_color2
			Color3,    //!< a_color3
			Indices,   //!< a_indices
			Weight,    //!< a_weight
			TexCoord0, //!< a_texcoord0
			TexCoord1, //!< a_texcoord1
			TexCoord2, //!< a_texcoord2
			TexCoord3, //!< a_texcoord3
			TexCoord4, //!< a_texcoord4
			TexCoord5, //!< a_texcoord5
			TexCoord6, //!< a_texcoord6
			TexCoord7, //!< a_texcoord7

			Count
		};
	};
7.3 片元:
$input v_color0

/*
 * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
 * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
 */

#include "../common/common.sh"

void main()
{
	gl_FragColor = v_color0;
}
7.4 变量定义:
vec4 v_color0    : COLOR0    = vec4(1.0, 0.0, 0.0, 1.0);

vec3 a_position  : POSITION;
vec4 a_color0    : COLOR0;
7.5 编译 shader:
编译 OpenGL 版本
./shadercRelease  -f vs_cubes.sc -o ./glsl/vs_cubes.bin --depends -i ../../src --varyingdef varying.def.sc --platform linux -p 120 --type vertex -O3
./shadercRelease -f fs_cubes.sc -o ./glsl/fs_cubes.bin --depends -i ../../src --varyingdef varying.def.sc --platform linux -p 120 --type fragment -O3


编译 Metal 版本
./shadercRelease  -f vs_cubes.sc -o ./glsl/vs_cubes.bin --depends -i ../../src --varyingdef varying.def.sc --platform linux -p metal 120 --type vertex -O3
./shadercRelease -f fs_cubes.sc -o ./glsl/fs_cubes.bin --depends -i ../../src --varyingdef varying.def.sc --platform linux -p metal 120 --type fragment -O3

shadercRelease 程序帮助脚本来自于 shader.mk,不会的可以参考

Options:
  -h, --help                    Help.
  -v, --version                 Version information only.
  -f <file path>                Input file path.
  -i <include path>             Include path (for multiple paths use -i multiple times).
  -o <file path>                Output file path.
      --bin2c <file path>       Generate C header file.
      --depends                 Generate makefile style depends file.
      --platform <platform>     Target platform.
           android
           asm.js
           ios
           linux
           nacl
           osx
           windows
      --preprocess              Preprocess only.
      --define <defines>        Add defines to preprocessor (semicolon separated).
      --raw                     Do not process shader. No preprocessor, and no glsl-optimizer (GLSL only).
      --type <type>             Shader type (vertex, fragment)
      --varyingdef <file path>  Path to varying.def.sc file.
      --verbose                 Verbose.

Options (DX9 and DX11 only):

      --debug                   Debug information.
      --disasm                  Disassemble compiled shader.
  -p, --profile <profile>       Shader model (f.e. ps_3_0).
  -O <level>                    Optimization level (0, 1, 2, 3).
      --Werror                  Treat warnings as errors.

-f glsl 脚本文本
-o 输出文件名
-i 包含 bgfx_shader.sh 的路径
--varyingdef varying.def.sc文件
--platform shader 参数,这个平台不管你是 win 下还是 linux 还是什么,
只要是 glsl shader,就写 linux

8.总结

优点缺点
跨平台文档理解有门槛
持续维护遇到问题没有资料
需要学习他们的demo
需要学习编译shader工具及转换
不支持vulkan
  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值