<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fumiya Funatsu</title>
    <description>The latest articles on DEV Community by Fumiya Funatsu (@funatsufumiya).</description>
    <link>https://dev.to/funatsufumiya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F330043%2Fa3c770d8-6ab8-42d1-a515-1eac846ac3aa.png</url>
      <title>DEV Community: Fumiya Funatsu</title>
      <link>https://dev.to/funatsufumiya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/funatsufumiya"/>
    <language>en</language>
    <item>
      <title>Bevy Engine, as a Small Unity, Big Processing (P5)</title>
      <dc:creator>Fumiya Funatsu</dc:creator>
      <pubDate>Tue, 23 Jan 2024 00:26:09 +0000</pubDate>
      <link>https://dev.to/funatsufumiya/bevy-engine-as-a-small-unity-big-processing-3edg</link>
      <guid>https://dev.to/funatsufumiya/bevy-engine-as-a-small-unity-big-processing-3edg</guid>
      <description>&lt;p&gt;(This article is self-translation from &lt;a href="https://qiita.com/funatsufumiya/items/b4b62ec7b044dd28e7fe" rel="noopener noreferrer"&gt;my original post in Japanese&lt;/a&gt;. I'm sorry if not translated well.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnye5tay3zd0tpcff9sip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnye5tay3zd0tpcff9sip.png" alt="2D Bloom sample of Bevy Engine"&gt;&lt;/a&gt; &lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: Creative Coding and Processing
&lt;/h2&gt;

&lt;p&gt;There are many game engines out there, what are you using now?&lt;/p&gt;

&lt;p&gt;I like so-called creative coding, and I use, for example, Unity, UE5, &lt;a href="https://derivative.ca/" rel="noopener noreferrer"&gt;Touch Designer&lt;/a&gt;, &lt;a href="https://www.notch.one/" rel="noopener noreferrer"&gt;Notch&lt;/a&gt;, React, etc., to make what I have in mind. I always choose a tool that seems to be just right for prototyping each time.&lt;/p&gt;

&lt;p&gt;When I wonder what the origin of creative coding is for me, I think it must be &lt;a href="https://processing.org/" rel="noopener noreferrer"&gt;Processing&lt;/a&gt; (also called P5&lt;sup id="fnref2"&gt;2&lt;/sup&gt;).&lt;/p&gt;

&lt;p&gt;When I look back on why I love Processing, it was just "simple", as ease of use. Even today, that philosophy continues in the form of &lt;a href="https://p5js.org/" rel="noopener noreferrer"&gt;p5.js&lt;/a&gt; and &lt;a href="https://openframeworks.cc/ja/" rel="noopener noreferrer"&gt;openFrameworks&lt;/a&gt;. For example, p5.js has an &lt;a href="https://editor.p5js.org/" rel="noopener noreferrer"&gt;online editor&lt;/a&gt; in your browser &lt;sup id="fnref3"&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7oeon6ucusqknt0gtcm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7oeon6ucusqknt0gtcm4.png" alt="p5.js online editor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From that time on, Processing required only one editor and nothing else, and we just enjoyed pure simplicity of writing code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Large-scale game engines and the in-between ravine
&lt;/h3&gt;

&lt;p&gt;By the way, creative coding is a formless concept, and I consider the so-called visual editors in Blender, Unreal Engine, etc. as the same creative coding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3c8awn16bag6oiw58ed1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3c8awn16bag6oiw58ed1.png" alt="Blender's geometry node"&gt;&lt;/a&gt; (Figure: Blender's geometry node &lt;sup id="fnref4"&gt;4&lt;/sup&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F715ii6dz8shgbgydpomk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F715ii6dz8shgbgydpomk.png" alt="Material Editor in Unreal Engine 5"&gt;&lt;/a&gt; (Figure: Material Editor in Unreal Engine 5 &lt;sup id="fnref5"&gt;5&lt;/sup&gt;)&lt;/p&gt;

&lt;p&gt;In fact, I myself make full use of such things to give shape to my ideas, and as the word of "no code" suggests, I feel "code" has become just "a concept" nowadays.&lt;/p&gt;

&lt;p&gt;Web browsers are also one type of engine, and "engines", not limited to game engines, are the backbone that supports our production and have become indispensable.&lt;/p&gt;

&lt;p&gt;However, sometimes I feel a desire to go back to the roots of something lightweight and easy to use like Processing, or I want something that combines modern concepts (such as reactive programming in React) and ease of use, in other words, &lt;strong&gt;something in between Unity and Processing&lt;/strong&gt;, which I can get my hands on immediately, without having to wait for dozens of GB of editors to download &lt;sup id="fnref6"&gt;6&lt;/sup&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bevy Engine, as a in-between Unity and Processing
&lt;/h2&gt;

&lt;p&gt;While I was thinking about above, I came across the &lt;a href="https://github.com/bevyengine/bevy" rel="noopener noreferrer"&gt;Bevy Engine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9vv445jfs45lq5disez.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9vv445jfs45lq5disez.png" alt="3D Gizmos example of Bevy Engine"&gt;&lt;/a&gt; &lt;sup id="fnref7"&gt;7&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Bevy Engine is open source and has not been developed for many years, although, there are already many volunteer &lt;a href="https://bevyengine.org/assets/#assets" rel="noopener noreferrer"&gt;plug-ins&lt;/a&gt;, just like &lt;a href="https://ofxaddons.com/" rel="noopener noreferrer"&gt;add-ons to openFrameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Similar to Processing and openFrameworks, the core is written small, with such plugin systems being added &lt;strong&gt;as you need&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And most importantly, you basically don't need any tools other than Rust (cargo). First, create an empty project with &lt;code&gt;$ cargo new bevy-hello&lt;/code&gt; &lt;sup id="fnref8"&gt;8&lt;/sup&gt;, move to the project folder with &lt;code&gt;$ cd bevy-hello&lt;/code&gt;, add bevy as a library with &lt;code&gt;$ cargo add bevy&lt;/code&gt;, and then just paste any code in &lt;code&gt;src/main.rs&lt;/code&gt; (e.g. the following) and run &lt;code&gt;$ cargo run&lt;/code&gt; to get it working.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// hello world example of src/main.rs&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;bevy&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;prelude&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;App&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;//.add_plugins(DefaultPlugins) // uncomment this to show the window&lt;/span&gt;
        &lt;span class="nf"&gt;.add_systems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Startup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wilehnp8do0naef1f7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wilehnp8do0naef1f7g.png" alt="hello world with VSCode editor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It takes a while to start (build, compile) the first time, but after the second time it reloads surprisingly fast and can hot-reload assets if you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short look at ECS (Entity Component System)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx5ycrfpyf4kwxunugio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx5ycrfpyf4kwxunugio.png" alt="ECS's mock-up diagram"&gt;&lt;/a&gt; (Figure: ECS's mock-up diagram &lt;sup id="fnref9"&gt;9&lt;/sup&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  First, "System".
&lt;/h3&gt;

&lt;p&gt;Now that we have written what is called "Hello World," let's take a look at some other code.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// (first part omitted)&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;App&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.add_plugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DefaultPlugins&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// this is a magic spell&lt;/span&gt;
        &lt;span class="nf"&gt;.add_systems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Startup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.add_systems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rotate_camera&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;update_config&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="nf"&gt;.run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is the beginning of the code taken from a sample called &lt;a href="https://bevyengine.org/examples/3D%20Rendering/3d-gizmos/" rel="noopener noreferrer"&gt;3D Gizmos&lt;/a&gt;, where &lt;code&gt;add_systems(Startup, ...)&lt;/code&gt; and &lt;code&gt;add_systems(Update, ...)&lt;/code&gt; registers functions, in terms of &lt;a href="https://processing.org/" rel="noopener noreferrer"&gt;Processing &lt;/a&gt;,  &lt;code&gt;setup&lt;/code&gt; (a function called only once) and &lt;code&gt;draw&lt;/code&gt; (a function called every time when updating).&lt;/p&gt;

&lt;p&gt;Let's take a look at one of the functions actually registered.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;gizmos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Gizmos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Res&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gizmos&lt;/span&gt;&lt;span class="nf"&gt;.cuboid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nn"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_translation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Vec3&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.with_scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Vec3&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;splat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nn"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;BLACK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;gizmos&lt;/span&gt;&lt;span class="nf"&gt;.rect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nn"&gt;Vec3&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="nf"&gt;.elapsed_seconds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.cos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nn"&gt;Quat&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_rotation_y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nn"&gt;Vec2&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;splat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nn"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// (last part omitted)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here's the amazing part: if you specify a &lt;strong&gt;type&lt;/strong&gt; for the arguments that points to what you want, and it will automatically bind that value. It's a trick that could be called &lt;a href="https://en.wikipedia.org/wiki/Dependency_injection" rel="noopener noreferrer"&gt;DI (Dependency Injection)&lt;/a&gt;,  how cool :)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Startup&lt;/code&gt; basically does registering elements, like  HTML or JSX in React. The elements are updated by functions registered in &lt;code&gt;Update&lt;/code&gt;, which is equivalent to JavaScript in HTML.&lt;/p&gt;

&lt;p&gt;We call this group of functions &lt;strong&gt;"System"&lt;/strong&gt;, and basically everything that does any work is written in "System" &lt;sup id="fnref10"&gt;10&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;The difference from &lt;code&gt;draw&lt;/code&gt; in Processing is that &lt;strong&gt;the drawing itself is basically done automatically&lt;/strong&gt; &lt;sup id="fnref11"&gt;11&lt;/sup&gt;. So, instead of &lt;code&gt;draw&lt;/code&gt;, it's called &lt;code&gt;update&lt;/code&gt;, and in &lt;code&gt;update&lt;/code&gt;, basically only parameters such as values and components are changed, not the drawing itself. This is similar to React and others.&lt;/p&gt;

&lt;h3&gt;
  
  
  All are Entity, all attributes are Component, all data are Resource
&lt;/h3&gt;

&lt;p&gt;And this is where it is similar to Unity (strictly speaking &lt;a href="https://unity.com/dots" rel="noopener noreferrer"&gt;Unity DOTS&lt;/a&gt;): all elements are derived from something called &lt;code&gt;Entity&lt;/code&gt;. Everything is &lt;code&gt;Entity&lt;/code&gt; (same as &lt;code&gt;Game Object&lt;/code&gt; in Unity), so it is easy to handle in a unified way, and furthermore, all attributes are derived from &lt;code&gt;Component&lt;/code&gt;, and since &lt;code&gt;Component&lt;/code&gt;s exist under the same concept in Unity, it is easy to understand how to read them.&lt;/p&gt;

&lt;p&gt;In addition, all data that you want to keep, which are so-called variables, become &lt;code&gt;Resource&lt;/code&gt;, and assets such as images and 3D data are &lt;code&gt;Asset&lt;/code&gt;. This is also simple and easy to understand.&lt;/p&gt;

&lt;p&gt;And how to get them from the &lt;code&gt;System&lt;/code&gt; is the same as before: declare a &lt;strong&gt;type&lt;/strong&gt; as an argument and it will fetch them for you &lt;sup id="fnref12"&gt;12&lt;/sup&gt;. It's magic.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;check_zero_health&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// Access Entity with `Health` and `Transform` Component.&lt;/span&gt;
    &lt;span class="c1"&gt;// Get `Health` as read-only, get `Transform` as mutable.&lt;/span&gt;
    &lt;span class="c1"&gt;// Optional: get the `Player` Component if it exists&lt;/span&gt;
    &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Health&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Player&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Get all matching Entities&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;health&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="nf"&gt;.iter_mut&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;eprintln!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Entity at {} has {} HP."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="py"&gt;.translation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt;&lt;span class="py"&gt;.hp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// If HP is 0, move to center&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt;&lt;span class="py"&gt;.hp&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="py"&gt;.translation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec3&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ZERO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;player&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;player&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// here Entity is `Player`.&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// code cited from (includes comments, but I translated into English from Japanese):&lt;/span&gt;
&lt;span class="c1"&gt;// https://xianliang2032.hatenablog.com/entry/2021/09/28/Rust_Bevy_Query%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;I would like to keep just as introduction to this architecture, which is called &lt;strong&gt;ECS (Entity Component System)&lt;/strong&gt;, but you can see that it has the same general-purpose mechanisms as Unity and others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lm54uy1qvl9894r4zut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lm54uy1qvl9894r4zut.png" alt="Unity and Bevy terminology correspondence chart"&gt;&lt;/a&gt; (Figure: Unity and Bevy terminology correspondence chart)&lt;/p&gt;

&lt;h2&gt;
  
  
  Other features: Cross-platform, low-level drawing engine abstraction, etc. (skips today)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4logfdp38x7whdcw7j1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4logfdp38x7whdcw7j1.png" alt="Cross platform check table"&gt;&lt;/a&gt; &lt;sup id="fnref13"&gt;13&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;There are many other interesting features of the Bevy Engine, such as the &lt;code&gt;wgpu&lt;/code&gt; mechanism, which allows automatic cross-platform support for DirectX, Metal, Vulkan, WebGL, etc. with a single code, but skips description today, because it would be commonplace in Unity and other platforms nowadays.&lt;/p&gt;

&lt;h2&gt;
  
  
  Last one: Plug-in system for more and more extensions / e.g. Inspector, Gizmo, Particles ...etc...
&lt;/h2&gt;

&lt;p&gt;Finally, I would like to mention a few things about plug-ins. For example, if you get greedy, you may wish to have an "editor" like Unity. Plug-ins can do it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qrr01npplb937ma06rg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qrr01npplb937ma06rg.png" alt="Bevy editor plug-in like Unity"&gt;&lt;/a&gt; &lt;sup id="fnref14"&gt;14&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;For example, if you want a GPU particle system, you can use &lt;a href="https://github.com/djeedai/bevy_hanabi" rel="noopener noreferrer"&gt;bevy_hanabi&lt;/a&gt;, with display a more casual inspector, &lt;a href="https://github.com/%20jakobhellermann/bevy-inspector-egui" rel="noopener noreferrer"&gt;bevy-inspector-egui&lt;/a&gt; can be used to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwabeaalse6uacaqbo3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwabeaalse6uacaqbo3w.png" alt="bevy_hanabi and bevy-inspector-egui"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The list of plug-ins is endless, but at last if you felt "want to write a UI in HTML!", a plugin called &lt;a href="https://github.com/jkb0o/belly" rel="noopener noreferrer"&gt;belly&lt;/a&gt; will do it for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pnigxlckisl3mqh7ih0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pnigxlckisl3mqh7ih0.png" alt="belly for bevy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This kind of casual extension is fun part of any engine, and thanks to the ECS architecture, I'm happy to be able to use it in parallel and well-ordered with other &lt;code&gt;Entity&lt;/code&gt;, &lt;code&gt;Component&lt;/code&gt;, and other structures without any discomfort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;p.s.&lt;/strong&gt; Bevy Plug-in list is here: &lt;a href="https://bevyengine.org/assets/#assets" rel="noopener noreferrer"&gt;https://bevyengine.org/assets/#assets&lt;/a&gt;, and here &lt;a href="https://github.com/topics/bevy-plugin" rel="noopener noreferrer"&gt;https://github.com/topics/bevy-plugin&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Summary: Merging "past" and "future" of Creative Coding will be...?
&lt;/h2&gt;

&lt;p&gt;Now, I have introduced the Bevy Engine as a "just fit" product in between, for those of you who are tired of Unity, Unreal Engine (and other game engines), and who are wondering what to do next to Processing in your programming classes. &lt;/p&gt;

&lt;p&gt;By the way, if you actually try to write a game with the Bevy Engine, you will be surprised at how hard it is to understand the errors that Rust produces... (LOL 😂) &lt;sup id="fnref15"&gt;15&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;...Half joking but... it's largely a matter of getting used to it, but Bevy Engine is designed so that you don't have to be so conscious of ownership and lifetime (which are difficult parts of Rust) thanks to the component system called ECS. And probably in the future, something like the Bevy Engine will be available from general languages such as TypeScript, and I feel that this may be the future of creative coding.&lt;/p&gt;

&lt;p&gt;Bevy has only been around for a short period of time, so there is no handy sketch sharing platform online like p5.js, or &lt;del&gt;there is no&lt;/del&gt; web-site or list of add-ons (&lt;strong&gt;p.s.&lt;/strong&gt; &lt;a href="https://bevyengine.org/assets/#assets" rel="noopener noreferrer"&gt;Bevy plug-ins list&lt;/a&gt; &lt;br&gt;
 already existed in official!), but already &lt;a href="https://bevyengine.org/examples/" rel="noopener noreferrer"&gt;Example&lt;/a&gt; can be viewed interactively with WebGL, and I think such a future is just around the corner.&lt;/p&gt;

&lt;p&gt;I hope that little by little, from a place like this, the best of each of the "past" and "future" of creative coding can be merged well together.&lt;/p&gt;



&lt;h2&gt;
  
  
  Additional information
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You can use &lt;a href="https://github.com/alphastrata/shadplay" rel="noopener noreferrer"&gt;shadplay&lt;/a&gt; as the same kind of tool like &lt;a href="https://www.shadertoy.com/" rel="noopener noreferrer"&gt;ShaderToy&lt;/a&gt; for &lt;code&gt;wgsl&lt;/code&gt; shader language, it's useful if you want to try only effects without worrying about ECS, or debugging purposes &lt;sup id="fnref16"&gt;16&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;



&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;quoted and reconstructed from &lt;a href="https://bevyengine.org/examples/2D%20Rendering/bloom-2d/" rel="noopener noreferrer"&gt;https://bevyengine.org/examples/2D%20Rendering/bloom-2d/&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn2"&gt;

&lt;p&gt;Originally, Processing had used the domain proce55ing.net, it became origin of P5. see &lt;a href="https://en.wikipedia.org/wiki/Processing#History" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Processing#History&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn3"&gt;

&lt;p&gt;As a side note, cultures such as &lt;a href="https://twitter.com/TweetProcessing" rel="noopener noreferrer"&gt;Tweet Processing&lt;/a&gt; is also interesting related to one-liners. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn4"&gt;

&lt;p&gt;Image cited from &lt;a href="https://forest.watch.impress.co.jp/docs/serial/blenderwthing/1373040.html" rel="noopener noreferrer"&gt;https://forest.watch.impress.co.jp/docs/serial/blenderwthing/1373040.html&lt;/a&gt; (Japanese article). ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn5"&gt;

&lt;p&gt;Image cited from &lt;a href="https://docs.unrealengine.com/5.0/en-US/organizing-a-material-graph-in-unreal-engine/" rel="noopener noreferrer"&gt;https://docs.unrealengine.com/5.0/en-US/organizing-a-material-graph-in-unreal-engine/&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn6"&gt;

&lt;p&gt;Just to follow up on the capacity thing, capacity and specs are relative, and I think the impression of what simplicity is will always change. In fact, Processing at the time was about 300 MB, which was not small in capacity. So, in the context of this article, I'll assume here that simplicity means keeping the core simple by using plugin systems, abstractions, etc. (Unity, for example, is already simple enough, I think). ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn7"&gt;

&lt;p&gt;quoted and reconstructed from &lt;a href="https://bevyengine.org/examples/3D%20Rendering/3d-gizmos/" rel="noopener noreferrer"&gt;https://bevyengine.org/examples/3D%20Rendering/3d-gizmos/&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn8"&gt;

&lt;p&gt;Commands beginning with &lt;code&gt;$&lt;/code&gt; refer to what you type into the terminal. (Omit the &lt;code&gt;$&lt;/code&gt; and type what follows.) ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn9"&gt;

&lt;p&gt;Figure cited from &lt;a href="https://blog.mozvr.com/introducing-ecsy/" rel="noopener noreferrer"&gt;https://blog.mozvr.com/introducing-ecsy/&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn10"&gt;

&lt;p&gt;"System" also allows you to specify dependencies and create combinations (called sets), but this is redundant and will not be discussed here. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn11"&gt;

&lt;p&gt;Note that this does not mean that you cannot customize your drawing, as there is a good balance provided between high-level APIs such as ECS, low-level APIs for the drawing engine itself (wgpu), and mid-level APIs that fall in between. Using mid-level APIs or low-level APIs, assured that the shader pipeline and various buffer objects can be manipulated. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn12"&gt;

&lt;p&gt;Code cited from  (includes comments, but I translated into English from Japanese) &lt;a href="https://xianliang2032.hatenablog.com/entry/2021/09/28/Rust_Bevy_Query%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" rel="noopener noreferrer"&gt;https://xianliang2032.hatenablog.com/entry/2021/09/28/Rust_Bevy_Query%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn13"&gt;

&lt;p&gt;Table cited from &lt;a href="https://bevy-cheatbook.github.io/gpu/intro.html" rel="noopener noreferrer"&gt;https://bevy-cheatbook.github.io/gpu/intro.html&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn14"&gt;

&lt;p&gt;Image cited from &lt;a href="https://zenn.dev/eloy/articles/ea11899ee3dbe4" rel="noopener noreferrer"&gt;https://zenn.dev/eloy/articles/ea11899ee3dbe4&lt;/a&gt; (Japanese article). ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn15"&gt;

&lt;p&gt;I omitted it in the article, but when you actually write the code, if you put &lt;a href="https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer" rel="noopener noreferrer"&gt;rust-analyzer in VSCode&lt;/a&gt;, the completion will work perfectly, so you are now ready. Have a happy coding! ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn16"&gt;

&lt;p&gt;Information was received from the official Bevy Discord &lt;a href="https://bevyengine.org/community/" rel="noopener noreferrer"&gt;community&lt;/a&gt;. I really appreciate all the support from the community. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;/ol&gt;

</description>
      <category>gamedev</category>
      <category>creativecoding</category>
      <category>poem</category>
    </item>
    <item>
      <title>Comparison of C++ Low-Level Graphics, Cross-Platform Frameworks and Libraries</title>
      <dc:creator>Fumiya Funatsu</dc:creator>
      <pubDate>Tue, 04 Feb 2020 14:18:06 +0000</pubDate>
      <link>https://dev.to/funatsufumiya/comparison-of-c-low-level-graphics-cross-platform-frameworks-and-libraries-58e5</link>
      <guid>https://dev.to/funatsufumiya/comparison-of-c-low-level-graphics-cross-platform-frameworks-and-libraries-58e5</guid>
      <description>&lt;p&gt;(This article is self-translation from &lt;a href="https://qiita.com/funatsufumiya/items/98ca9aca0c9f8b608ca1" rel="noopener noreferrer"&gt;my original post in Japanese&lt;/a&gt;. I'm sorry if not translated well.)&lt;/p&gt;

&lt;p&gt;I usually write codes of graphical, cross-platform apps with &lt;strong&gt;OpenGL&lt;/strong&gt;, but recently thought how I can create apps supporting &lt;strong&gt;Metal&lt;/strong&gt;, &lt;strong&gt;DirectX&lt;/strong&gt;, or &lt;strong&gt;Vulkan&lt;/strong&gt; with &lt;strong&gt;Low-Level Graphics APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I researched frameworks and libraries which is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implemented in C++&lt;/strong&gt; ( C++98 or 11,14,17 etc. )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports low-level graphics APIs&lt;/strong&gt; ( Vulkan, DirectX11/12, Metal etc. )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross platform&lt;/strong&gt; ( Win/Mac/Linux, iOS/Android etc. )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight or embeddable / extensible&lt;/strong&gt; compared to Unity and Unreal Engine 4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I just focused on low-level Graphics APIs. So &lt;strong&gt;please check other articles if you need comparison of game engines&lt;/strong&gt;. There are many game engines implemented with frameworks in this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Pros ✅&lt;/th&gt;
&lt;th&gt;Cons ❌&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLGL&lt;/td&gt;
&lt;td&gt;Supports many APIs&lt;/td&gt;
&lt;td&gt;Need knowledge of each platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Forge&lt;/td&gt;
&lt;td&gt;Supports many platforms&lt;/td&gt;
&lt;td&gt;Need knowledge of each platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diligent Engine&lt;/td&gt;
&lt;td&gt;Same code for platforms&lt;/td&gt;
&lt;td&gt;No Metal support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bgfx&lt;/td&gt;
&lt;td&gt;Same code for platforms / Easy&lt;/td&gt;
&lt;td&gt;No tessellation shader support&lt;sup id="fnref1"&gt;1&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oryol / sokol_gfx&lt;/td&gt;
&lt;td&gt;For embedded and Web&lt;/td&gt;
&lt;td&gt;No computing shader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Methane Kit&lt;/td&gt;
&lt;td&gt;Win / Mac compatibility&lt;/td&gt;
&lt;td&gt;No mobiles support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bs::framework&lt;/td&gt;
&lt;td&gt;For game engine development&lt;/td&gt;
&lt;td&gt;Only stable in Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  LLGL (Low Level Graphics Library)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/LukasBanana/LLGL" rel="noopener noreferrer"&gt;https://github.com/LukasBanana/LLGL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhte297qq2974kpzcoexv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhte297qq2974kpzcoexv.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;License: &lt;strong&gt;BSD-3 clause&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported Platforms:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DirectX&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Vulkan&lt;/th&gt;
&lt;th&gt;OpenGL&lt;/th&gt;
&lt;th&gt;OpenGL ES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Supported Shader Types:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vertex&lt;/th&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Geometry&lt;/th&gt;
&lt;th&gt;Hull (TC)&lt;/th&gt;
&lt;th&gt;Domain (TE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( Different shaders needed for each platform such as glsl/hlsl/metal/spv. No automatic cross-compilation. )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Few dependencies and easy build using cmake. Supporting DirectX / Metal / Vulkan / OpenGL (ES), and every types of shaders. I think this is &lt;strong&gt;the most comprehensive and high performance framework&lt;/strong&gt;, with compact implementation.&lt;/p&gt;

&lt;p&gt;This framework wraps low-level APIs, but &lt;strong&gt;you have to configure every parameter for different platform, and sometimes different codes using macros are needed&lt;/strong&gt;. So the highest performance on each platform can be achieved, but you need advanced knowledge of Metal, DirectX and Vulkan, and also GPU.&lt;/p&gt;

&lt;p&gt;Additionally, &lt;strong&gt;different shaders are needed for each platform&lt;/strong&gt;. In this case, cross-compiling your shader code by yourself makes it easier, using &lt;code&gt;spirv-cross&lt;/code&gt; or &lt;code&gt;shaderc&lt;/code&gt; and so on. This can be bothered, but separated shaders are good point when higher performance and detailed configuration is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Forge
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ConfettiFX/The-Forge" rel="noopener noreferrer"&gt;https://github.com/ConfettiFX/The-Forge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0w6tgexw5kir8m1p5ygi.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0w6tgexw5kir8m1p5ygi.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;License: &lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported Platforms:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DirectX&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Vulkan&lt;/th&gt;
&lt;th&gt;OpenGL&lt;/th&gt;
&lt;th&gt;OpenGL ES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( Also supports &lt;strong&gt;XBOX, PS4, Switch, Stadia.&lt;/strong&gt; )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported Shader Types:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vertex&lt;/th&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Geometry&lt;/th&gt;
&lt;th&gt;Hull (TC)&lt;/th&gt;
&lt;th&gt;Domain (TE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( Need different shaders for each platforms such as glsl/hlsl/metal/spv. No automatic cross-compilation. )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is very &lt;strong&gt;high-quality framework created for implementing renderers&lt;/strong&gt; of custom (or your own) game engine. However, &lt;strong&gt;OpenGL (ES) is not supported&lt;/strong&gt;. So you can't use this for older smartphones or PCs.&lt;/p&gt;

&lt;p&gt;This framework seems to be &lt;strong&gt;stable and well maintenanced&lt;/strong&gt;. CI and unit tests are used in many cases and already used in many products.&lt;/p&gt;

&lt;p&gt;The usability is just like LLGL. Advanced knowledge of each platform is needed, but you can configure as you like if high performance is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diligent Engine
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/DiligentGraphics/DiligentEngine" rel="noopener noreferrer"&gt;https://github.com/DiligentGraphics/DiligentEngine&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fal02wz71gpbhadav1i5u.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fal02wz71gpbhadav1i5u.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;License: &lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported Platforms:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DirectX&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Vulkan&lt;/th&gt;
&lt;th&gt;OpenGL&lt;/th&gt;
&lt;th&gt;OpenGL ES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (MoltenVK)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (MoltenVK)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Supported Shader Types:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vertex&lt;/th&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Geometry&lt;/th&gt;
&lt;th&gt;Hull (TC)&lt;/th&gt;
&lt;th&gt;Domain (TE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (&lt;code&gt;*2&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( &lt;code&gt;*1&lt;/code&gt; Shaders are automatically cross-compiled from HLSL )&lt;br&gt;
( &lt;code&gt;*2&lt;/code&gt; Can not use compute shader in Mac OpenGL, because Mac only supports OpenGL 4.1 or lower )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Few dependencies and easy build using cmake &lt;sup id="fnref2"&gt;2&lt;/sup&gt;. This framework's name has "Engine" but this is &lt;strong&gt;lightweight and portable&lt;/strong&gt; framework.&lt;/p&gt;

&lt;p&gt;Noteworthy, &lt;strong&gt;the same source code (without macros) and shaders are applied for every platform&lt;/strong&gt;. In most cases, rewriting your code is not needed.&lt;/p&gt;

&lt;p&gt;However, disappointedly, &lt;strong&gt;Metal is not supported&lt;/strong&gt; so that &lt;strong&gt;compute shader cannot be used on Mac OpenGL&lt;/strong&gt; (because Mac's OpenGL version is lower than 4.3.) Except for that, there is very &lt;strong&gt;efficiently implemented modern API&lt;/strong&gt;, when compared to bgfx (similar framework, describes later), &lt;/p&gt;

&lt;h2&gt;
  
  
  bgfx
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/bkaradzic/bgfx" rel="noopener noreferrer"&gt;https://github.com/bkaradzic/bgfx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2zt22dm52ysqn9noogr7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2zt22dm52ysqn9noogr7.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;License: &lt;strong&gt;BSD-2 clause&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported Platforms:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DirectX&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Vulkan&lt;/th&gt;
&lt;th&gt;OpenGL&lt;/th&gt;
&lt;th&gt;OpenGL ES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❓&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❓&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❓&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( Supports &lt;strong&gt;WebGL&lt;/strong&gt; with Emscripten or asm.js. Also supports Raspberry Pi )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported Shader Types:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vertex&lt;/th&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Geometry&lt;/th&gt;
&lt;th&gt;Hull (TC)&lt;/th&gt;
&lt;th&gt;Domain (TE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (&lt;code&gt;*2&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;❌ (&lt;code&gt;*2&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( &lt;code&gt;*1&lt;/code&gt; Automatically cross-compiled from original shader language like GLSL )&lt;br&gt;
( &lt;code&gt;*2&lt;/code&gt; For DirectX and OpenGL, there is &lt;a href="https://github.com/LSBOSS/bgfx" rel="noopener noreferrer"&gt;an unofficial fork&lt;/a&gt; which enables hull/domain shader, but not maintenanced for a long time... )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Released and being &lt;strong&gt;developed since 2015&lt;/strong&gt;, there are many products using this framework, and &lt;strong&gt;many examples and forums'  Q&amp;amp;As can be found&lt;/strong&gt;. Building this framework is also easy with cmake, and an original build manager called GENie makes it easier.&lt;/p&gt;

&lt;p&gt;Just like Diligent Engine, &lt;strong&gt;the same source code is used for multiple platforms&lt;/strong&gt; without macros (in most cases). &lt;strong&gt;APIs are very simple and easy to understand&lt;/strong&gt; and very extensible with libraries you want. &lt;/p&gt;

&lt;p&gt;However, only one regrettable point is that &lt;strong&gt;tessellation shaders are not supported&lt;/strong&gt;, but computer shader enables it (see the official examples.) And this can be done in Mac and iOS because &lt;strong&gt;Metal is supported&lt;/strong&gt;, this is very strong point when compared to Diligent Engine.&lt;/p&gt;

&lt;p&gt;About shaders, an original shader language like GLSL will be automatically cross-compiled for all platforms. But it is a little unique, variable definition of input and output as a header file for them.&lt;/p&gt;

&lt;p&gt;At last, please note that &lt;strong&gt;some functionalities are limited for platform compatibility&lt;/strong&gt;, such as &lt;br&gt;
 not complete command buffers, tessellation shader (described above). &lt;strong&gt;The compatibility seems to be treated as the most important point&lt;/strong&gt; in this framework's development policy. I feel this is the good point, but can be a burden of the performance. Moreover, some APIs is not so modern and not so efficient when compared to Diligent Engine. But this may be improved because recently often updated.  &lt;/p&gt;

&lt;h2&gt;
  
  
  oryol / sokol_gfx
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/floooh/oryol" rel="noopener noreferrer"&gt;https://github.com/floooh/oryol&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/floooh/sokol" rel="noopener noreferrer"&gt;https://github.com/floooh/sokol&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkinmnem98407ugq6tvil.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkinmnem98407ugq6tvil.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;License: &lt;strong&gt;MIT&lt;/strong&gt; (oryol), &lt;strong&gt;zlib&lt;/strong&gt; (sokol)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported Platforms:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DirectX&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Vulkan&lt;/th&gt;
&lt;th&gt;OpenGL&lt;/th&gt;
&lt;th&gt;OpenGL ES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( &lt;strong&gt;WebGL&lt;/strong&gt; is supported, and you can run on &lt;strong&gt;Raspberry Pi&lt;/strong&gt; with OpenGL ES. )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported Shader Types:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vertex&lt;/th&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Geometry&lt;/th&gt;
&lt;th&gt;Hull (TC)&lt;/th&gt;
&lt;th&gt;Domain (TE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( For &lt;code&gt;sokol_gfx&lt;/code&gt;, you should prepare shaders for each platform. )&lt;br&gt;
( For &lt;code&gt;oryol&lt;/code&gt;, GLSL-like language is auto cross-compiled. )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;oryol&lt;/code&gt; and &lt;code&gt;sokol_gfx&lt;/code&gt; are created by the same author. &lt;code&gt;sokol_gfx&lt;/code&gt; is a &lt;strong&gt;header-only single file library for C language&lt;/strong&gt;, and &lt;code&gt;oryol&lt;/code&gt; is a &lt;strong&gt;lightweight C++ framework&lt;/strong&gt;. It is designed as &lt;a href="https://gist.github.com/bkaradzic/2e39896bc7d8c34e042b" rel="noopener noreferrer"&gt;Orthodox C++&lt;/a&gt;, so you can probably use it with C++11 with older compilers.&lt;/p&gt;

&lt;p&gt;These two are very &lt;strong&gt;compact file-size libraries, having sufficient functionalities&lt;/strong&gt;. This feature will work well with &lt;strong&gt;WebGL&lt;/strong&gt;, the total file size will be very small when compiling with &lt;code&gt;asm.js&lt;/code&gt;/&lt;code&gt;wasm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The only feature I miss, is that &lt;strong&gt;compute shader is not supported&lt;/strong&gt;. But the author says that it may be implemented as another library as an addon (for sokol_gfx). This is very good news if true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methane Kit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/egorodet/MethaneKit" rel="noopener noreferrer"&gt;https://github.com/egorodet/MethaneKit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvdzgwo227brlpq78olvr.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvdzgwo227brlpq78olvr.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;License: &lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported Platforms:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DirectX&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Vulkan&lt;/th&gt;
&lt;th&gt;OpenGL&lt;/th&gt;
&lt;th&gt;OpenGL ES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅ (&lt;code&gt;*1&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( &lt;code&gt;*1&lt;/code&gt; Linux/Vulkan version is currently in development )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported Shader Types:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vertex&lt;/th&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Geometry&lt;/th&gt;
&lt;th&gt;Hull (TC)&lt;/th&gt;
&lt;th&gt;Domain (TE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( HLSL 5.1 is used for auto cross-compiling. )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This framework is based on C++17, and much &lt;strong&gt;focused on **Desktop&lt;/strong&gt;. &lt;strong&gt;Windows/Mac compatibility&lt;/strong&gt; is treated the most important in this framework. You just need the same source code and shaders for Windows/Mac. Recently, Linux/Vulkan version is announced and now in development.&lt;/p&gt;

&lt;p&gt;This is very young framework which is published on GitHub a year ago, and now very actively updated recently.&lt;/p&gt;

&lt;h2&gt;
  
  
  bs::framework
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/GameFoundry/bsf" rel="noopener noreferrer"&gt;https://github.com/GameFoundry/bsf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fghrmyucyjcn9wajwvxh5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fghrmyucyjcn9wajwvxh5.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;License: &lt;strong&gt;MIT&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported Platforms:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DirectX&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Vulkan&lt;/th&gt;
&lt;th&gt;OpenGL&lt;/th&gt;
&lt;th&gt;OpenGL ES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (&lt;code&gt;*1&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✅ (&lt;code&gt;*2&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (&lt;code&gt;*1&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( &lt;code&gt;*1&lt;/code&gt; Implementation via MoltenVK is under discussion, at the time of writing. )&lt;br&gt;
( &lt;code&gt;*2&lt;/code&gt; &lt;strong&gt;Not working properly on Mac&lt;/strong&gt; at the time of writing. )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported Shader Types:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vertex&lt;/th&gt;
&lt;th&gt;Fragment&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Geometry&lt;/th&gt;
&lt;th&gt;Hull (TC)&lt;/th&gt;
&lt;th&gt;Domain (TE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (&lt;code&gt;*2&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;( &lt;code&gt;*1&lt;/code&gt; HLSL subset language is auto cross-compiled. )&lt;br&gt;
( &lt;code&gt;*2&lt;/code&gt; compute shader is disabled on Mac, because Metal/Vulkan is not supported and OpenGL 4.3 or above is required but not on Mac. )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;an integrated framework which provides functionalities for/as game engine&lt;/strong&gt;, created by the author of &lt;a href="https://www.banshee3d.com/" rel="noopener noreferrer"&gt;Banshee 3D Engine&lt;/a&gt;. This is &lt;strong&gt;still in beta version&lt;/strong&gt; and very young, the first version was released only a year before.&lt;/p&gt;

&lt;p&gt;Based on C++14, and provides the functionalities like Unity / UE4, scene component system, physics, file loading functions, animations, sound players, low-level graphics APIs. Well documented and well-structured.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;not working properly on Mac&lt;/strong&gt; at the time of this writing, and &lt;strong&gt;mobiles are not supported&lt;/strong&gt;, and more, &lt;strong&gt;Metal is not supported&lt;/strong&gt; &lt;sup id="fnref3"&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other frameworks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Acid (&lt;a href="https://github.com/EQMG/Acid" rel="noopener noreferrer"&gt;https://github.com/EQMG/Acid&lt;/a&gt;) ....... Game engine with Vulkan / MoltenVK.&lt;/li&gt;
&lt;li&gt;magnum (&lt;a href="https://github.com/mosra/magnum" rel="noopener noreferrer"&gt;https://github.com/mosra/magnum&lt;/a&gt;) ....... Game framework with OpenGL / WebGL. Considered to be implemented in Vulkan.&lt;/li&gt;
&lt;li&gt;Wicked Engine (&lt;a href="https://github.com/turanszkij/WickedEngine" rel="noopener noreferrer"&gt;https://github.com/turanszkij/WickedEngine&lt;/a&gt;) ....... 
Game engine with DirectX, only for Windows.&lt;/li&gt;
&lt;li&gt;Rizz (&lt;a href="https://github.com/septag/rizz" rel="noopener noreferrer"&gt;https://github.com/septag/rizz&lt;/a&gt;) ....... Tiny C framework using sokol_gfx. &lt;a href="https://github.com/septag/glslcc" rel="noopener noreferrer"&gt;glslcc&lt;/a&gt; is used for cross-compiling, and can use compute shader on DirectX as experimental.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In this article I focused on low-level graphics APIs, so I intentionally wrote nothing about OpenGL-related frameworks, such as &lt;a href="https://openframeworks.cc/" rel="noopener noreferrer"&gt;openFrameworks&lt;/a&gt; or &lt;a href="https://libcinder.org/" rel="noopener noreferrer"&gt;Cinder&lt;/a&gt;. However, there are Vulkan implementations  (&lt;a href="https://github.com/openframeworks-vk/openFrameworks" rel="noopener noreferrer"&gt;openFrameworks-vk&lt;/a&gt;, &lt;a href="https://github.com/cinder/Cinder/tree/vulkan" rel="noopener noreferrer"&gt;Cinder-Vulkan&lt;/a&gt;). But it is experimental and not seems maintenanced well...&lt;/p&gt;

&lt;p&gt;If you want to know about OpenGL related creative frameworks, I recommend &lt;a href="https://github.com/terkelg/awesome-creative-coding" rel="noopener noreferrer"&gt;awesome-creative-coding&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Similar Frameworks ( Implemented in Other Languages )
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;gfx-rs (&lt;a href="https://github.com/gfx-rs/gfx" rel="noopener noreferrer"&gt;https://github.com/gfx-rs/gfx&lt;/a&gt;) ....... Implemented in Rust language. This is the most complete framework in this theme. Maybe you can use it with C API from C++?&lt;/li&gt;
&lt;li&gt;veldrid (&lt;a href="https://github.com/mellinoe/veldrid" rel="noopener noreferrer"&gt;https://github.com/mellinoe/veldrid&lt;/a&gt;) ....... .NET Implementation.&lt;/li&gt;
&lt;li&gt;Kha (&lt;a href="https://github.com/Kode/Kha" rel="noopener noreferrer"&gt;https://github.com/Kode/Kha&lt;/a&gt;) ....... Haxe Implementation. Many platforms and APIs are supported. It seems easy to use this. Probably you can use this framework if cross-compiled to C++.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;It became too long article than I expected... Thank you for reading. Any comments are welcome :)&lt;/p&gt;

&lt;p&gt;I made simple comparison table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Pros ✅&lt;/th&gt;
&lt;th&gt;Cons ❌&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLGL&lt;/td&gt;
&lt;td&gt;Supports many APIs&lt;/td&gt;
&lt;td&gt;Need knowledge of each platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Forge&lt;/td&gt;
&lt;td&gt;Supports many platforms&lt;/td&gt;
&lt;td&gt;Need knowledge of each platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diligent Engine&lt;/td&gt;
&lt;td&gt;Same code for platforms&lt;/td&gt;
&lt;td&gt;No Metal support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bgfx&lt;/td&gt;
&lt;td&gt;Same code for platforms / Easy&lt;/td&gt;
&lt;td&gt;No tessellation shader support&lt;sup id="fnref1"&gt;1&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oryol / sokol_gfx&lt;/td&gt;
&lt;td&gt;For embedded and Web&lt;/td&gt;
&lt;td&gt;No computing shader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Methane Kit&lt;/td&gt;
&lt;td&gt;Win / Mac compatibility&lt;/td&gt;
&lt;td&gt;No mobiles support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bs::framework&lt;/td&gt;
&lt;td&gt;For game engine development&lt;/td&gt;
&lt;td&gt;Only stable in Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I maybe use bgfx if I need one in my production, because of its easiness and compatibility.&lt;/p&gt;

&lt;p&gt;LLGL and The Forge are strong options for high performance. These two can be use for your own original game engine development. However, in some case, it have to be compared with Unity, or Unreal Engine 4.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;awesome-vulkan (&lt;a href="https://github.com/vinjn/awesome-vulkan#Libraries" rel="noopener noreferrer"&gt;https://github.com/vinjn/awesome-vulkan#Libraries&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Tessellation with compute shader is supported.  ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;In this time, Windows script is not prepared. So you have to read scripts for Mac/Linux, and mimic it and you need type some commands. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;For building, &lt;a href="http://docs.bsframework.io/latest/build.html" rel="noopener noreferrer"&gt;Hello World&lt;/a&gt; can be built soon, but &lt;a href="https://github.com/gamefoundry/bsfExamples" rel="noopener noreferrer"&gt;Examples&lt;/a&gt; needs many additional files before building by script, and every time fails downloading. You may need many modifications of your cmake file. And some case &lt;a href="https://github.com/GameFoundry/bsf/issues/129" rel="noopener noreferrer"&gt;not working properly on mac&lt;/a&gt;, I could not work it well on my laptop, with pre-built binary and original build from master branch. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>cpp</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
