Category: tutorial

  • C++ Guide

    ⏱️Overview

    This will be a quick introduction or guide to C++, listing key topics, gathering many links and how to learn, get started, and get more info.
    It’s certainly not a tutorial on C++ or its syntax, since there are many already, some linked here.

    🔗Links

    Few links with tutorials below are covering all C++ language topics. Good for learning whole language, remembering something or latest features.

    ⚖️Comparisons

    A good quick comparison: Differences between C C++ C#
    If you know C: Compatibility of C and C++
    All languages on wikipedia
    A different take, showing why Object Oriented is bad.

    📄Text tutorials

    Good, full, C++ language tutorials and references for specific topics.

    https://cplusplus.com/doc/tutorial/very good tutorial
    https://cplusplus.com/reference
    https://en.cppreference.com/w/ – very good, detailed reference, e.g.
    https://en.cppreference.com/w/cpp/container/vector

    rest, meh:

    https://www.w3schools.com/cpp/cpp_references.asp – poor, very basic
    https://www.tutorialspoint.com/cplusplus/cpp_quick_guide.htm
    https://www.softwaretestinghelp.com/cpp-tutorials/
    https://www.cprogramming.com/advtutorial.html

    STL tutorials

    STL is the C++ Standard Template Library with many template collections and algorithms. Which is the recommended approach in C++. Old way was to use new and delete to allocate memory yourself.

    Good long pdf.
    Very big reference pdf probably with all.
    Web cpp reference for containers.
    Containers with graphical visualizations here.

    Tutorial with grouped short examples (e.g. map) also algorithms.
    short https://takeuforward.org/c/c-stl-tutorial-most-frequent-used-stl-containers/

    ▶️Video tutorials

    The best playlists I found to learn whole C++ from start is here and separate for concurrency.
    Quite long and detailed explanations, nicely presented.

    There are quite many big videos or playlists with series on youtube.
    Likely not the best way to learn by just listening. Much better to read, copy code and practice.
    But some topics are good to be seen in a practical session video.

    E.g.: C++ Multithreading
    weak_ptr and shared_ptr

    For big, long e.g.
    10h video – for beginners
    very long – using VS code etc
    advanced topics playlist but from 2017, bit outdated

    🔗Links collections✨

    Bigger lists of many links including libraries, books, features etc. More advanced topics too.

    https://github.com/fffaraz/awesome-cppFrameworks, Libraries, big list e.g. for GUI, XML, and many more.

    https://github.com/AnthonyCalandra/modern-cpp-features – many modern C++ features listed with examples.

    https://github.com/rigtorp/awesome-modern-cpp

    https://github.com/yuchdev/CppBooks

    ⚙️Tools around C++

    General info on wikipedia

    C++ has a list of software around it.
    You could e.g. use Visual Studio with C++ and not know of any, like I did before.
    So, if you’re on Windows and using Visual Studio, you could even skip all in this chapter. Since it has all the commercial stuff needed to build and run C++ on Windows (sure, VS can have more, but the wrong way).
    Same (or even worse) goes for MacOS and using their XCode for C++ too.

    But on Linux, you’ll need some effort to set up an IDE for C++, it’s likely required. Using Linux gives definitely more freedom and opportunities to learn. Additionally you can learn the Free and Open Source way, not some commercial solution.

    Basic set up

    Regardless any other tools later, there are some common things you’ll need to get for building projects from sources. Those can be enough to get a C++ to build and run.

    But for C++ you will need a compiler like g++ (or clang, or other).

    So for example, on a Debian-based Linux setup, I usually start with:

    sudo apt-get install g++ binutils gdb git make cmake

    But there are also other alternatives or extras like: clang ninja-build clangd etc.

    CMake

    CMake (wiki)- is used to configure projects, in its own language (text files). It can then generate project files for many IDEs or build tools like Make or ninja.

    CMake tutorial. CMake is a step up to learn for sure, but for me the main advantage is that I don’t bother with IDEs or OSes, I edit one configuration and can build for more later.

    Compilers

    Compilers (bigger list) – just few main for example:

    Dependency and libraries resolving

    Conan – software package manager for C and C++

    vcpkg – similar, but MS tool

    More listed here.

    Tools, memory

    Valgrind – memory debugging, leaks etc

    Cppcheck – static code analysis


    📊IDEs

    Wiki with Integrated Development Environments (IDEs) comparison here.

    I list here few, biggest IDEs, my favorites that I’ve used for C++.

    VS Code

    Not recommended, the MS version with telemetry and such. Available on Ubuntu, but not e.g. on Debian since it’s not fully FOSS.

    Good comparison between VS Code and VSCodium here and here.

    VSCodium

    Recommended, pure FOSS version, without telemetry and MS stuff. Available on many OSes.
    To install, get a release archive and unpack. E.g. for desktop Linux name starting with VSCodium-linux-x64-

    Definitely needs some more effort to set up for C++, unlike other IDEs.

    My list of extensions that I use with it.

    Favorite extensions

    • C++ by Microsoft – only in VS Code
    • clangd by llvm-vs-code-extensions – C/C++ completion, navigation, and insights – in VSCodium
    • CodeLLDB by vadimcn – a native Debugger for C++
    • Native Debug by webfreak – for gdb and lldb
    • CMake by twxs – language support
    • CMake Tools by ms-vscode – Extended CMake support, configurations etc, on status bar
    • Git History Plus by cweijan – for git log, history view
    • Bookmarks by alefragnani – bookmark lines
    • Project Manager by alefragnani – To save folders with projects in list
    • Favorites Manager by oleg-shilo – Tab with list of files, can be edited in file
    • Todo Tree by Gruntfuggly – gathers all todo, fixme etc from files, in own tree list
    • Output colorizer by IBM – for colors in .log files etc
    • Python by ms-python – for syntax and running .py scripts
    • XML by redhat – for its syntax
    • Black Violet Blue by Crystal Hammer – naturally, my theme

    Qt Creator

    I used it for a year or so, it was easy to set up on Linux and get going for C++ with CMake (included).
    So I can still recommend it.
    It works very fast, but is rather limited in options, and not many extensions available. Meaning you could find something missing.
    Also it can be seen as a commercial for Qt solutions, which I don’t recommend. They are too big and too Qt specific. For my smaller projects this was way too much, and also the longer you use e.g. Qt GUI for C++ the more effort it will need to move to other library.

    Visual Studio (VS)

    Commercial, huge (7GB or more) and bloated. I can’t recommend.
    I used it for years at work and earlier myself on Windows too.
    I think it’s still the way to go on Windows. Sure it works, but that’s it, can’t think of privacy or sources or freedom.

    Comes with a big installer too, where you need to have some idea of what components to install. IIRC C++ wasn’t even selected in recent versions.
    Has many extensions and themes. But for my favorite scroll plugin, each VS version had to have own support and own author which was inconsistent and annoying (for developers probably too).

    It has other languages like C#, but for me now it feels like a commercial hub for MS solutions, also with news feed for it and paid stuff.
    Also one major issue is that if you use Visual Studio and MS products you get (shoehorned) into their way and if you stick too long you’ll less likely or have more issues getting . And their way is definitely the one giving them most profits, not (necessarily) you.

    KDevelop

    I didn’t use it, but quickly looked at this IDE and it seems quite decent. Has features that every IDE should have. I just don’t see any IDE theme to turn it black fast after installing.

    Eclipse CDT

    I used it before I knew VSCodium for a year. I can’t recommend it, since it is based on Java (and was mainly for it at start I think) but it is just too universal and generic as VS. Only difference it has some packages specific to development needs. Small to install but slower at working. Not too many new fancy extensions.

    📂File types

    Header files

    video talk

    File extensions

    Headers  .h     or .hh .hpp .hxx
    Sources  .cpp   or .cc .cxx .c++

    Compiling .cpp gives output files:

    Windows .obj
    Linux   .o

    Dependencies

    It is good practice to split code into libraries.
    The worst way would be to include all sources together and it would take the longest to build.
    Splitting functionality to libraries speeds up whole build (if you don’t change library code) and hides the implementation.

    Libs – static libraries

    Windows .lib
    Linux   .a

    To compile your program (or library), the .h headers from library are need to be included.
    Library’s compiled code must be linked (.lib or .a) with your program (or library).
    There are also some header only libraries, which don’t need linking.

    DLLs – dynamic libraries

    Windows .dll
    Linux   .so

    To use DLLs, also .lib files and header files .h are needed.
    Additionally binary (.dll or .so) files are needed when starting your program
    (executable is .exe on Windows, and no extension on Linux, but has x attribute(s)).


    C++ key concepts

    A few inner concepts, some quite different from other languages.


    C++ with CMake

    ⚙Basic example

    The simplest example, for start and a way of checking if it all builds and works.

    It has 2 files:

    • CMakeLists.txt
    
    cmake_minimum_required(VERSION 3.10)
    
    project(main CXX)
    
    add_executable(main main.cpp)
    
    • main.cpp
    
    #include <iostream>
    using namespace std; 
    
    int main()
    {
        int i = 10;
        i += 2;
        cout << "Hello. " << i << endl;
    }

    When started, it should print out on console: Hello. 12

    C++ starter projects

    Good templates for starting C++ projects with CMake and other config files e.g. for formatting, unit tests etc.

    https://github.com/TheLartians/ModernCppStarter
    https://github.com/filipdutescu/modern-cpp-template

  • CG Shader demos, fractals

    ⏱️Overview

    Short introduction to real-time computer graphics (in demos, visualizations, etc) with shaders.
    Mainly gathering topics and lots of links to more informational websites and example shaders.
    Ending with big section of my favourites (mainly on shadertoy).

    🌎Websites

    Where you can browse and edit shaders in web browser.

    • shadertoy my favourite, with tags, comments and lots of shaders and great looking demos
    • smoothstep also for building animations
    • glslsandbox somewhat lower quality, also need to switch to 1x every time, and seems to have spam and worse browsing

    📚Tutorials

    The main difference to rasterisation (covered here), is that there are no 3D models with vertices, own textures etc. These demo are done with pixel (called fragment in GL) shader for fullscreen rectangle. And anything that appears is computed by it. This means also all geometry has to be somehow described by equations and functions.

    📖Tutorial websites

    shadertoy tag tutorial and how to, e.g. keyboard movement
    short post how-does-a-shadertoy-work
    smoothstep tutorial

    Shadertoy tutorial – 16 parts – very good, 2D and 3D, basics, camera, light, buffers etc
    Long videos, tutorials playlist starts with basics and 2D, later e.g. ray marching

    Shader Tutorials by Ronja – good, many topics

    iquilezles – many tutorials and more – all articles

    thebookofshaders book, not full
    realtimerendering tutorial and lots of books

    Ray Tracing (slower, higher quality) short tutorial, all tags

    Ray Marching

    How to Make 3D Fractals probably best video tutorial for raymarching and its effects

    Ray Marching, and making 3D Worlds video with Math other good video with code and combining
    ray marching signed distance functions, with light
    raymarching from scratch part 1
    raymarching from scratch part 2
    Introduction to Raymarching

    The Distance Estimator Compendium (DEC) many SDF functions for primitives and 3D fractals with screens

    hg_sdf glsl library for building signed distance functions, with primitives and combining operations

    3D primitives / shapes – SDF functions
    2D SDF shape functions

    🪄Tutorial shaders

    Basics

    basics 05 – gl smoothstep
    basics 01 – antialiased circle
    basics 03 – camera

    2D Ray Marching visualization

    Ray Marching Demo For Beginner 2D
    2D SDF Tracing Visualization2d Raymarching very simple animated
    Visualizing Raymarching with colors
    2D Grid Traversal w/ Refraction

    Raymarching Primitives Commented has many shapes
    Raymarching – Primitives by iq, with many distfunctions
    Floating things

    Ray marched scene for beginners has fresnel, hard shadow, reflection
    Xor’s Basic Raymarcher
    Ray Marching Template simple short

    Other

    PBR Demo
    PBR Tutorial
    shadertoy all with tag tutorial

    Ray tracing

    Verbose Raytracer has mouse rotate, colors, multi reflections
    RayTracing Tutorial – Step 3
    RayTracing Tutorial – Step 6
    Real raytrace in 3D

    To Sort

    [SH17C] Raymarching tutorial watch steps in shader

    Ray Marching with Unique Colors

    Iterative Function Guide2D, fractal

    Copy Basic Distance Fields Tutfew stages at once

    3D Glow Tutorial white torus
    Simple Raymarching Example Scene
    020 look at all the maths many functions meh
    HOWTO: Ray Marching many shapes

    Fork Field-fx w dratini0 668

    Dila’s Raymarch Tutorial infinite world
    Simple Flythrough Example infinite

    happy Jumping tutorial sphere, floor

    Camera Movement Around an Object

    2D

    PT V – R, T, S 2D basic shapes
    sdf 2D lights and shadows

    2D Volumetric Light Tutorial

    Very simple tunnel Atmospheric scattering explained sun to sky atmosphere color

    🌊Fluid simulation

    webgl-fluid-simulation with theory and equations

    29a.ch 2012 webgl-fluid-simulation with web demo and computations flow

    🔮Fractals

    Fractal on wikipedia.

    2D

    Basic

    Sierpiński triangle or gasket, basic fractal
    Apollonian basic circle, (or sphere in 3D) recursive packing

    Mandelbrot

    The Mandelbrot Set Explained – long very good video, going from 1D to 2D (complex), and Mandelbrot to Julia connection
    maths.town website with Mandelbrot explained

    Very long zooming videos of Manderbrot (ultra deep) and other similar.
    e.g. Density 2h zoom, Inifnite 2h zoom, Deepish 3h zoom, Edge of Infinity 2,5h
    Mandelbrot set with blended gradients

    3D

    kleinian high quality, similar to apollonian
    kaliset lines
    more in favorites below ..

    ⛓️Other demo sites and programs

    pouet huge, old webiste with various demos
    mercury a demogroup
    Syntopia – Generative Art, 3D Fractals, Creative Computing – blog with many posts, some math etc

    Kalles Fraktaler 2+ – program for zooming in 2D fractals
    Mandelbulber – 3D fractal program, has examples with screnshots
    FragM application for exploring pixel based graphics on the GPU, derived from Fragmentarium. Videos from it.

    Marble Marcher CE ball game on fractals

    fractalforums

    Shadertoy-renderer for making videos of shaders
    twigl


    ✨Favorites

    📌Shader tags, search

    Shaders of the Week

    🔮 Fractal
    🧊 Polyhedron regular 3D shapes etc
    ☁️ Clouds
    💎 Crystal
    ☀️ Refraction

    2D

    Is it still raymarching?
    Noise animation – Electric
    Lightning flow
    Crystal Abyss violet blue crystal like
    2D Clouds
    Graffiti 3D, Cyborg Signature, Brush toy
    Colliding Scribbles
    Another xor automaton
    Complex polygons
    Angle Ruler / Gauge
    Numbers with LUT and Bits

    💧 2D Fluids

    Molten bismuth awesome,Spilledgreat
    Multiscale MIP FluidalsoRock-Paper-Scissor-4D colorful

    Chimera’s Breath smoke, Smoke remake

    Expansive Reaction-Diffusion, Entropy Escape Decay
    Lattice Boltzmann slow, Frozen Window ice formation

    Liquid Toy tar, Fire!Fire! burning fake simulation
    HD LIQUID like metal foil
    Branching Paths strange
    Minimal Fluidish Simulacre

    2D Fractals

    Alien Skies colorful, mouse
    Fractal lines of symmetry
    circling, very cool
    more colorful than average 2 poles, tripy colors

    Nova fractal cool, mouse
    Fractal Colors simple pastels, I also made it in my KC4 keyboard controller display
    Super Julia Fractal tripy lines
    Fractals: MRS white, short code
    Fractal Soup simple 1 color, cool, another first fractal attempt

    Pseudeo 3D mandelbrot
    Julia: Julia improved, Red Julia, Julia – Traps 2
    Animated Lyapunov others by tag

    🏞️ 3D

    Nature

    Campfire at night
    Swiss Alps, Himalayas
    Seascape ocean, another Oceanic
    Where the River Goes
    Auroras, Miracle Snowflakes
    Production Sky Rendering, other The sun, the sky and the clouds

    Abstract

    explosions underwater and Taste of Noise 7 like fireworks, blending
    Rotating Volume Rings 3 torus clouds with distortion
    dark violet wave noise cube
    Wavy and Sculpture II interesting
    OMZG Shader Royale – NuSan

    Scenes

    Bubble Buckey Balls
    Rhodium liquid carbon
    Mushroom, Piano
    Shaking Jello, [SH18] Human Document animation

    🔮 3D Glass etc.

    Multiple Transparency
    Raytraced Quartic Surface
    Inside the mandelbulb

    Marbles: Nova Marble blue animated, Playing marble green, rm -f dark with rays
    Cloudy crystal, red sphere intersect pub, noise blob

    Almost physically based glass
    Ice Primitives with sliders
    Glass cubes in infinity mirror
    Refractive Index, Photon Mapped Caustics

    Curious Crystal
    Liquid in glass
    Impulse glass

    Neon Crystal, Kaleidoscope Crystal, Gyroid Crystal, Ocean Crystal
    Creation Stone
    Crystal Tetrahedron

    3D Infinite World

    Nature

    Homeward bird fly
    Desert Canyon, similar Desert Passage
    Leizex rocks
    3D Cellular Tiling
    Neptune Racing
    Protean clouds
    Visceral Infection blood vein inside
    Industrial Complex

    Abstract

    Server Room
    Alien Ruins

    Party Concert Visuals 2020
    Underwater Neural Forest
    Entangled Vines
    Noise 3D Fly Through blobs

    Rainbow Fractal Descent
    mud planet

    Transparent

    Interactive thinks 3D noise, very cool, with 4 sliders
    Misty Grid glow, lines, colors
    002-Blue and Palace of Mind dark blue lines

    3D Fractals

    Solid

    Remnant X fly inside, with light
    similar Fractal gutter
    Fractal Explorer DOF with WSAD moving

    Mandelbulb etc

    Mandelbulb Deconstructed white
    Morning glare glass Mandelbulb
    Juliabulb – derivative
    Raiden Fireball

    Other

    Kleinian variations, kleinian skulls,
    Kleinian Seahorse HQ slow static
    Apollonian
    Fractal Explorer, WSAD moving

    Larval + GUI rotational with sliders
    Sphere FBM noise cube

    Transparent

    All fractals by gaz:
    29_gaz color 4 flowers, 86_gaz,
    41_gaz, 36_gaz blobs, 49_gaz wire,
    111 gaz animated, 108 gaz

    Minimal code

    Manjusaka (239chrs)
    Flower tunnel

  • CG, Rendering, Shaders

    ⏱️Overview

    Introduction to real-time computer graphics (in games, visualizations, etc) through rasterisation.
    Short, mainly gathering topics and many links to more informational websites.

    💡Rendering types

    Rendering very good page with list of features (common tasks in rendering).

    3 main rendering types / techniques are available:

    🔺Rasterisation

    Rasterisation – transforming vector graphics data (font, image, 3d model, scene, etc.) into a 2d image (lines of pixels, on screen).

    Most common process in games and other real-time visualization software.
    Look and performance (frames per second) are limited by GPU hardware and computational power.

    Optimized for GPU, so it is required. An important GPU diagram, will show that GPU has many more cores (computational units) than CPU. High end GPUs now have thousands, low budget hundreds and laptops and integrated tens. Few GPU inside pics at end here.

    ☀️Ray tracing

    Ray tracing produces the most photorealistic, movie quality look. It is the most computationally expensive, so not real-time, but recently GPU are so powerful that some simpler scenes can be rendered this way.
    It works by casting rays from camera and is very complex since rays can bounce, reflect, refract, etc. many times. This complexity is not friendly for GPU shaders, they perform better with simpler code like in rasterisation.
    Usually associated with big, powerful, 3D software that can work for minutes or days to get a single picture. E.g. Blender.

    🔮Ray marching

    Similar to ray tracing but much less complex. Ray marching uses a signed distance function (SDF) making it less computationally expensive. But this requires rather basic 3D objects. Also with SDF some effects are easier to achieve in real-time (like AO, glow etc). Seems quite popular for shader demos and 3D fractals.


    From now on I will focus only on ⚙️Rasterisation.

    ⚙️Pipeline⏩

    Rendering – very good page with list of features (common tasks in rendering).

    Old GPUs before 2001 had only fixed pipeline, its steps are shown on this image. Old GPUs did all steps in hardware only with some adjustments possible.
    Now we do vertex transformation and lighting with shaders in code, ourselves, allowing plenty of customizations. Modern GPUs don’t have limits on shader code like old had.
    Old basic demo of Quake 3 shows the first cool effects with vertex shaders.

    Image search for diagram. How it works video.

    Few links with pipeline steps etc:

    • Graphics_pipeline good info on wikipedia, with pipeline under Shader
    • 3D Graphics with OpenGL – long and very good tutorial page with everything including primitives, matrices, frustum, lighting.
    • khronos wiki pipeline with short info on steps
    • Introduction to OpenGL and GLSL – shows OpenGL 2, 3 and 4 pipelines, primitives etc. From 2014, long page with code and VS 2012.
    • Simpler pipeline for WebGL
    • Lot of documentation with links, few specific pipelines, for GL 4, DX12, Vulcan, Metail etc.
    • Very old but detailed pipeline for DirectX9

    🎓Math

    It is rather important, especially when creating an engine. But less so if you’re using an engine alredy, which provide useful functions.

    Few posts with math, like vectors 4, matrices 4×4,
    Again same page 3D Graphics with OpenGL has matrices for rotation, projection etc.

    Video1 tutorial general, Video2 on projection.

    📊Features (steps)

    Glossary of terms on wiki.

    List of common shading algorithms

    🔨Basic

    • Some culling related: Hidden surface determination, Z-buffer
    • Shading – color and brightness for a surface from light
    • Lighting computation – Specular
      Blinn-Phong, Specular highlight Cook-Torrance
    • Texture-mapping – a method of applying detail to surfaces.
      Also texture related are Mipmap and anisotropic filtering.
      With textures having alpha (transparent value), we can achieve e.g. tree leaves, fences with simple alpha test, or glass with alpha blending. Alpha test writes to depth buffer so it’s easier. But glass does not, and needs to be sorted (apart from OIT).
    • Fog – in non-clear atmosphere. Blends everything to fog color with distance.
      The oldest effect. Was fixed, now done in shaders, has to be used the same way for all. Can have different fog types, like height based.
    • other webgl textured spotlight

    🪄Normal map

    Detail added with extra normal map (texture) and some more per pixel (fragment) shader code.

    🌒Shadows

    Shadows – the effect of obstructing light. shadow web demo, other demo.

    Soft shadows – varying smooth by partially obscured light sources. VSM web demo

    For large scale:

    ✨Shaders

    Shader wiki. Languages: GLSL, HLSL. Shaders are basically pieces of code (with computations) running on GPU, with some structures of data being passed between them and GPU.

    The main types are vertex shader operating on vertices (which can have 3D positions, normals, texture coordinates, etc) and can transform them, e.g. read from height map texture(s) for terrain or water surface. Second tyoe is fragment / pixel shaders used heavily for shading, lighting, normal mapping etc.

    🚶Animation

    Vertex shader blending values from bones to vertex.

    web demo with sliders for animations blend.

    🌐Tessellation

    Newer type of shaders allows adding more triangles, e.g. giving more geometry detail closer. Usually uses a texture to know the height.

    Tessellation wiki

    Videos:

    Modern OpenGL Tutorial – Tessellation Shaders – 2nd half has 2D example
    Interactive Graphics 18 – Tessellation Shaders – long video but starts with basics too

    🛡️Physically Based Rendering (PBR)

    Physically based rendering wiki, uses Bidirectional Reflectance Distribution Function (BRDF).

    Gives more realistic lighting and shading with 2 more additional textures (or just parameters): roughness and metalness.

    Simple Web demo with sliders and dynamic reflection. Another demo.

    Web Examples: old gun web demo, Baja car model, Bike model.

    Long PBR doc in Filament.

    🔮Other

    • 🪞Reflection – mirror-like or highly glossy reflection. Was easy when flat.
      To look believable / good would need cubemap for each object like a car. Or for corridors more of them and blending between.
    • 🔮Refraction – bending of light associated with transparency, web demo and other.
      This is really like the worst thing for rasterization. Would need extra cubemap for each object.
    • Level of detail (LOD), a very important aspect of rendering. The further away from camera, the lower detail should geometry have (e.g. trees, rocks).
      Also crucial for terrain rendering. E.g. video simple grid, complex, quadtree.
    • Volume rendering, volume instancing demo, nice ☁️cloud web demo. Search for volumetric fog.
    • Particle system – fast rendering of many particles, for dirt, smoke, fire, explosions, magic effects, etc.
      Was done on CPU before and rendered with point sprites. Now all computing could be done by GPU making more particles possible (even millions).
      Could be also done (movement) with compute shaders which can do any computations on GPU, not just for rendering.
    • HW Instancing, explained in Ogre. Important technique to reduce draw calls when very many instances of objects are present.
    • Translucency – highly scattered transmission of light through solid objects
    • Caustics (a form of indirect illumination) – reflection of light off a shiny object, or focusing of light through a transparent object, to produce bright highlights on another object
      Fancy water with surface and caustics 🌊water web demo.
    • Subsurface scattering demo e.g. for skin

    🖼️Effects, post process📷

    Post processing effects work on final 2D screen image pixels. They don’t use 3D geometry at all, but can use some more screen textures like depth buffer. Done using fragment / pixel shaders.

    • Non-photorealistic rendering – e.g. Cel shading for comic like style.
    • Bloom – fake effect adding glow to screen. Was quite overused in past games.
      Web demo.
    • HDR – floating point intensity and eye adaptation dimming for whole screen, like aperture in cameras.
      Web demo.
      Tone mapping
    • Depth of field – Blurring screen parts out of focus. Should be only used for very close scenes, not far.
    • God Rays – sunbeams, or light shafts / rays.
      Web demo.
    • Motion blur – Blurring screen due to fast motion. Happens naturally in video cameras for movies, but in rendering has to be done specially.
    • SSAO – Screen Space Ambient Occlusion. It darkens areas that are less lit. It’s fake, but works quite well, giving more shadow feel. Especially in areas that aren’t lit (have only ambient and would be not shaded).
      If not done in real time as effect, then AO can be baked into textures for object in 3D modelling tool.
      Web demo with sliders.
    • Screen Space Reflections. Cheaper and fake with only near horizontal camera view looking okay.
      web demo.

    Deferred rendering a different approach (from 2013), useful for high lights count. Seems old and unused now.

    Approaching zero driver overhead AZDO search, quite important publications for engine.

    Polygonal-Light Shading with doc paper, web demo and video.

    ☀️Global Illumination (GI)

    Global illumination – surfaces illuminated by light reflected off other surfaces (indirect light). More screens in e.g. radiosity.

    Good long talk explanation video with history of various methods.
    Video with few methods and listing comparison aspects: Scalable Global Illumination for O3DE.

    Forward rendering search. Ogre-next has few demos: Forward3D, Instant Radiosity. Voxel Cone, Local Reflections.
    Clustered shading demo with good document links.

    📊Engines

    Engines list on wiki.
    I will list just a few here, that I saw some more of with links to lists.

    Web based: WebGL and Three.js

    🚗Game

    Game Engines already have all components needed for games like: physics, GUI, scripts, etc.
    In their editor software you can create games without even writing code. Some have graphs for game events, some would need writing scripts (code). Same goes for shaders, can be done as graphs connecting blocks.

    Big “free” but commercial, they also have a big store with assets you can buy, and a tiny “free” set:

    FOSS (open source):

    Basic video of same game in 3 game engines.

    Many lists with engines e.g. here, alternatives here or here, 100 list c++ here.

    🟢Only rendering

    This type lets you choose other components (like physics engine, GUI etc.) and combine yourself. It needs much more effort, but gives more freedom and customization. Requires C++ programming skills, as well as writing shaders. Importing 3D objects from modelling software can be more complicated too.

    • Ogre – older branch, has RTSS shader system.
    • Ogre-next – new with good examples of techniques, GI too. Scripts for building from sources. Has HLMS material system.
    • Wicked Engine – pretty advanced and FOSS
    • bgfx – needs building from sources, but has good examples.

    Many more C++ based here, and here, search pbr here.

    Assets can be found on few wesites like: blendswap, sketchfab etc. There you can also choose CC0, CC-BY, etc. licensed ones for FOSS games.

    Some game programming and C++ playlists.

  • Linux vs Windows (or MacOS)

    ⏱️Overview

    Yes, there are many such comparisons on internet, example search.
    This is my longer guide, basing on my experience of Windows and Linux, to which I moved and use daily.
    In later sections I will be introducing some of Linux specifics and end with a quick guide for developing.

    ❔Who is this for?

    I think this guide can be useful for many people, wanting to know more about other OSes and for those who want to move to Linux.

    I’ll try to cover few main differences (which I experienced) from such perspectives, for various people types:

    1. Gamers or other users of some big commercial software.
    2. Users, who can install Linux, and anything else needed on it (or those who have friends which can do this).
    3. Developers, who will also develop software on it.
    4. Kids and older people, who can’t install or configure programs themself and do only simple things on PC.

    You can jump or check ⏳Conclusions chapter for my answers.

    ❔Who am I?

    Just as an early warning, because there are many people who will know more.

    I am a professional software engineer (mainly C++). As a hobby I do develop a 3D game and few other projects since years.
    I am not a system administrator or other person who manages various systems. Surely they have much more experience in this area.

    Of course you can read more about me.

    📜My history

    I started long ago in DOS systems. Then for many years I was using Windows: 95, 98, XP and 7.

    Since 2012 I tried Ubuntu and then Kubuntu, occasionally to check if our game Stunt Rally also works well on Linux.

    In 2017 I did setup a VM in VirtualBox with Debian, at work, and have been using it with Eclipse IDE for developing an embedded Linux project written in C and using ash. I did learn a lot this way. And realized I could use only Debian for my daily development.

    In 2019 I decided that I will not use Windows 10 at all on my PCs and stated using Debian 10 instead.
    I’m glad to say that use only Debian (now 11) on my PC since 2019 and my other 2 PCs for my parents.

    📝My motivation

    What made me switch away from Windows after so many years of using it?
    Well after I read windows7sins (never version also for 10 and 11), especially about their freaking telemetry (also on wiki), I had enough.
    Windows 7 already pissed me off when my sound card suddenly couldn’t record “What you hear”, but having all that spying garbage in system was just beyond (any OS purpose). And I decided to simply not use Windows.

    Obviously for me, Windows 10 looks cheap, basic and ugly (1 color) compared to Windows 7 (colorful icons etc.). It was that decision to support mobile devices, by making desktop PCs look worse, like an empty piece of paper.
    Later I found the final killer flaw, with is this very annoying white flash bug, when some apps start or show. MS screwed up big time. Seems like they can’t or don’t care about fixing something so basic for years. I can’t even.
    Well needles to say this one bug is enough for me to not use software (I saw it in Chrome before too) even whole OS.


    ⚖️Comparison

    Shortest

    Well, there was this image that funny enough sums it up really good.
    It shows: “An Update is Available for Your Computer..”
    and below the 3 main OS-es with reactions about updates on them:

    • Linux – Cool, more free stuff
    • Windows – Not again!
    • Mac – Oh only $99

    So yeah, this goes along my own experience, which write next (OFC these are my opinions):

    MacOS, briefly

    My old impression is that Macs are just the worst (and thus using MacOS). They are way too expensive. There is likely big money spent on promotion, case, looks etc. My experience with Mac PCs was short (at work in 2011 or so) but from what I saw: hardware inside was poor, I could buy like 2 PCs for the same money with similar or 1 with much better performance. Plus that annoying HDD noise inside a monitor without a PC case was just ridiculous (yes I do mod my PC a lot). So yeah, I called it “shit in white packaging” and never even thought of using them again.

    Nowadays we see that Apple criticism page has even longer list than Microsoft’s. Another great page with very long list.
    I’d even put the planned obsolescence topic at top (followed by violation of our right to repair). I’d say it’s basically their 1st rule for making iPhones. Obviously it is extremely wrong for whole humanity, and best for their profits only.
    Thus I recommend staying far away from IMO the worst company ever and any of their products or services.

    🪟Windows, flaws

    Windows is a product of another huge company, which does a lot of things against humanity too, see Microsoft criticism page.
    Just like with any closed commercial software, you won’t have much control of it. Their freaking telemetry works even if you disable it, and who knows what else is their OS doing. It is still that ancient commercial approach relying on hiding how they created something and selling it.

    I already mentioned it looks poor. It also barely allows any theme look customization. And the oldest tiny (like for 640×480 VGA or so) non-resizable system settings windows are just ridiculous and still there, reminding it of that decades old codebase. I think here is a page with some similar opinion, and with more cursing.

    But the new start menu edition is garbage. I always replaced it by Classic/OpenShell getting it close to what Windows XP had.
    Additionally, the latest News display and the whole Windows Store are for me a huge nope. I’m guessing it was good for profit to make a damn TV with commercials out of PCs, or a shopping mall, the pinnacle of commercial stupidity.

    Okay there is one good thing: usually old applications still work in newer versions, and some for years.
    On the other hand: windows registry mess, COM and other standards, are just the worst, since 30 years. Oh and the ever growing damn WinSxS folder.

    Windows included apps are basically garbage too, I mean Calculator, Paint (I use GIMP, earlier Paint.NET), Registry (I use Registry Finder) and lastly Image viewer (I used FastStone Image Viewer).

    There are even applications needed to customize basic OS things: TClock, start menu OpenShell, 7+ Taskbar Tweaker, Winaero Tweaker etc. Well. that’s just MS being commercial, cheap and lazy. Many of those apps aren’t FOSS (another FOSS explanation), so you can’t see how they work or customize them yourself.

    Commercial⛔

    Well for me the worst thing is: if you pay them, you support all of this commercial evil too (from criticism pages).

    There is also an old movie Pirates of Silicon Valley (1999) which I also recommend. It is somewhat shocking to see how Microsoft and Apple came to be and what they did (stealing, cheating, etc). Obviously it didn’t improve, and only got worse. But it did surprise me how bad it looked even at their start. I see both companies have issues with labor and employees abuse too.

    My (brutal yet honest) opinion in one sentence for commercial OSes (and their companies):

    They do crime against humanity and treat users as slaves, plus you’re paying for it, while Linux gives you freedom.

    There was also an old documentary Revolution OS (2001), about the Open Source Movement. Starring key people like Linus Torvalds and Richard Stallman.

    ☠️Other issues

    Commercial software like Windows (at least) bring also other possible wrong ways of OS use.

    • One is old not updated Windows versions still working. If you need to pay to update it seems like a better choice. They have support for long though, but after that no fixes.
    • Other is using cracked versions, without updates, which likely get infected with malware (and what not), and can become zombie PCs. Again, may seem like a better choice since you don’t pay.

    Obviously best alternative is using a free OS, so cost is not a matter. But surely enough they are different so moving may take a while. And yes IMO OS should not cost. In other words, why should you pay for OS when there already are free ones running well since years.

    🐧Linux, why

    Linux is the best solution for OS, because it:

    • Doesn’t cost you money, and you can copy or install it freely. Possibly even on your router 😄.
    • Gives you Freedom. From above commercial garbage, and freedom to learn from it.
    • Can look way better (e.g. with KDE), or basic and use less resources.
    • Allows plenty of customizations.
    • Is really well documented. Which is great to learn it at start and later.
    • Is better made with packages, and with root user.
    • Is easier and more friendly for developers.

    There are likely more reasons, and I guess many could have their own too.

    Here is a website with many reasons why you should switch to Linux with some more info.


    📊More differences

    Here is a list of some key areas where systems will be different. All of which could affect your OS choice. And likely all will make an impact on how long we can adapt to different OS.

    💰Cost

    One extremely important aspect. Sure, it may not be important if:

    • You only have 1 PC. It may become a thing if you have few.
    • You don’t care about expenses. Certainly the worst approach (you’ll lose a lot of money, and won’t even know how much and on what).
    • You have a lot of (or too much) money. Well you could support those creators who don’t.
    • You’re running or working in a company.
      Which will go the commercial way and use the most popular system for their software, to maximize their profits.
      Not considering Linux if it only is on few % of all PCs.
      Also not caring about employees privacy or their preferences.

    📃License

    Obviously commercial software comes with its own license. It basically doesn’t allow you anything more than just use what you paid for. Commercial licenses can also be long and complicated, IMO making sure it brings profits for its creators, and to make sure only well paid lawyers understand it all. Well that’s the commercial way isn’t it. I’m glad we have Free Software for opposite.

    🔒Privacy

    Well surely an important issue and goal. Since telemetry and such this is gone in Windows. I don’t know the situation on MacOS, it was already killed by cost, for me.

    As for Linux, there are even few distros focused on security, and privacy, e.g. Kali, Tails, and other.

    ⚙️Drivers, GPU

    Well, there is this topic. I think the situation improved. I mean you can download drivers for AMD or NVidia cards from them and they were working for me. But yeah such commercial GPU companies weren’t or aren’t giving much support for Linux which isn’t (yet?) the most popular choice.

    One more thing worth noting here is the open source drivers that can be used instead of commercial ones, e.g. Mesa.

    📂File systems, partitions, etc.

    Naturally, this had to be different too. I mean these things are almost completely different in Linux and Windows.

    Partitions

    E.g. popular partition for Linux would be ext4 or btrfs. For Windows it is still NTFS. Some pen drives or memories use FAT32.
    A wiki page about this is Disk_partitioning, also showing for Linux: GParted tool and Grub boot loader.

    So on Windows you get drives like c:\, d:\, and so on, you can e.g. mount network drives to any other unused letters.
    Windows uses \ for path separators but / works too.
    It also had and has stupidly long paths like: c:\Programs Files, old c:\Documents and Settings, and for user settings: C:\Users\username\AppData\Roaming\, C:\Users\username\AppData\Local\Temp etc.

    On Linux there is a well established file system also explained on wikipedia. It has top level folders like: /bin /dev /home /lib /usr and so on. Linux uses / for separators only.
    And yeah there are many other websites describing the file system like this or that.
    Drives on Linux are usually like: /dev/sda/, /dev/sdb/ etc. but others could be in /opt or /media/cdrom.

    MacOS came out of UNIX which was also the base of Linux, so I think it is similar, but it has its own things too.

    File Extensions

    Another significant difference, on Windows there is .exe file extensions for binaries that can be started. On Linux there is a executable attribute (x) and such files usually don’t have any extension.
    On Windows shared dynamic libraries have .dll and on Linux .so. Static libraries on Windows have .lib and on Linux .a.

    Hidden

    On Windows you could hide any file or folder, by setting Hidden attribute. On Linux there is no such thing, and it works so that if any file or folder starts with dot . then it will be hidden.

    Admin vs Root user

    On Windows there is this UAC (with annoying screen dimming rest, it can be disabled) asking to confirm (yes/no) if something critical is installed or done. It does actually tend to make people run more programs as admin already, e.g. to skip it.

    On Linux there is root user. It is needed whenever you want to install something or access its files. And it requires typing password. I find this way better. But yeah, my keyboard types my passwords for me, so I don’t mind that.
    There also are goups and attributes for root, group and user, explained e.g. here.

    Updates

    As for updates on Windows, like on that image, they are annoying. You cannot disable them, Windows can force some. Also usually restart is required. And what’s being updated is hidden. Well clearly they don’t want you to see they’re fixing another bug letting others total control of your system, am I right? Or what they changed in their telemetry, etc.

    On Linux it’s different. You clearly see what will be updated, and you can chose what you want to update and when. And restart isn’t needed.

    Installing software

    This is also one key difference, but maybe not that visible for end user.

    Sure, maybe the new Windows store looks different. And plagues like Steam (for games) also really hide this too. (Clearly I dislike both).
    But the way I see it on Windows, basically any program has its own download and installer (and can have its own issues too). Which can do whatever (or nothing and just run if it’s portable) in file system, that stupidly huge registry etc. Even worse on top of that, many programs come with their own way for updating themself (another custom program). All of which is for me annoying at best and incoherent.

    On Linux this is way better. I write about it in later chapter 📦Packages. And there are also software applications with catalogues, similar to store, except that all are free on Linux of course.

    GUI, look

    Like already described above, Windows 10 look is simply the cheapest, bare minimum with almost no customization.

    Now I will say that KDE is the clear winner for me. When it comes to how a modern GUI for OS should look like on modern PCs. And the amount of customizations you can make is just simply right (no, not to much, it’s nicely big). I mean usually you can change a theme for program and should for OS too, but with KDE you can change theme of any component (like: windows, taskbar, GUI controls, colors, icons, mouse pointers, fancy effects, etc.) and you can browse and install new themes for these directly in settings.

    Sure, there is one downside, an inconsistency that happens between looks of some programs. So we got default Qt look in KDE, but some use GTK, GTK2 or GTK3 and each of these GUIs have their own themes to choose, likely looking different. Not a big issue and there could be a solution too.

    ⏳Conclusions

    So going back to different types of people (or their situations), my thoughts are like so:

    1. Games and commercial software

    Which don’t support Linux.
    Well this is the hopeless situation, that will most likely not change and make you stick with Windows or MacOS, if you critically need to use some specific software (program or game). But yeah, I’d say it’s at least worth trying to find alternative(s).

    Sure, gaming is getting more popular in Linux since years, but still it’s not like (most or) all games could be played there too.
    I think Linux is likely not mainly for games because that’s the most commercial use, for yeah gaming consoles, where you play and won’t do much more intelligent stuff. Then followed by probably Windows.

    But gaming on Linux definitely exists. Few big AAA games can work on Linux. The most popular big engines Unreal Engine and Unity work on and support Linux.
    And there are even gaming Linux distributions having many old PC and console emulators or gaming variants like SteamOS, Garuda gaming, probably more.

    There are lists of games running (natively) on Linux too, e.g. on wikipedia, sites like freegamer (with FOSS games), and naturally lots of random .com websites, and lastly on Steam too (mostly paid, and IMO garbage, except maybe 1 in 100 to 1000).

    There is also Wine, which emulates Windows on Linux. It may not always work.

    Some more info about Gaming On Linux.

    2. Users who can install

    For those who can install Linux, and anything else needed on it. That’s the best situation.
    I’d say if you’re young e.g. in college, you’re likely able to try Linux and move to it too. Especially if technical or computer knowledge is not difficult for you.

    3. Developers

    Who will also develop software on Linux.
    This probably depends. Because if you develop for Windows (and e.g. use C# WPF or other Windows only software), also if you got used to Visual Studio IDE too much and won’t want to change that, then obviously that’s hard to change.But if you develop as hobby like me, and want to move, then you can. I also believe it is much easier to develop on Linux (thanks to its packages for dependencies). Well at least in C++ like I do, I imagine with Python there won’t be much difference.
    I’ll say it took me a while though, because I wanted my favorite programs to work on Linux too.

    4. Older people and kids

    Who can’t install or configure programs themself and do only simple things on PC
    In this situation it likely that they won’t notice the difference. E.g. if all they do is anyway in web browser. And they’re not gamers, still wanting some Windows-only game to run.

    For kids it’s nearly the same, except they play more games I guess. So it’d be up to their parents (or teachers) to show a better way and install Linux, which makes it easier to learn e.g. programming.

    E.g. for my parents it was possible to move, and it was up to me to update their PC and get rid of that Windows virus. I’m glad to say both my parents are now also using Debian 11. They mainly use Firefox, play few KDE board games and watch our pictures.


    👉Starting with Linux☑️

    How to try

    Of course it’s better to try before moving to a different OS.
    There are few possibilities:

    • Bootable USB drive with live version.
      If BIOS / motherboard can boot it (I guess all new can).
      Many main distros have info about their Live USB version. Some website with tools.
      Probably the cheapest way.
    • Burn a DVD with a live version (wiki: Live CD, Debian info).
      If such drive or recorder is available. It depends of course, you may not even have a DVD drive. I see laptops without them. I also stopped using such, and don’t have one in my PC.
    • Create VM in e.g. VirtualBox.
      • It will be slower and use host PC resources. Could have some issues (or crash). Depends on how well it is supported, since most hardware is emulated or redirected to host PC.
      • If it works, then it could be a faster way to try more Linux distributions just from .iso images, without rebooting etc.
      • Somewhat more advanced topic, since you’ll need to properly set up VM settings. I usually set up VM for Linux like so: 4 GB RAM, 4 CPUs (of 8 available), 256 GB drive, 3D acceleration: enabled, clipboard: bidirectional, VT-x seems already enabled by default.
      • To have shared folder, it needs to install GuestAdditions. But I think this isn’t always needed to make the screen bigger (for sure Debian needed it, but few others I tested worked fine without) and have 3D acceleration.
    • Get a separate (SSD) drive and install there.
      Seriously, having two OSes on one drive can end very badly. I’ve heard a few times and experienced it too. E.g. repairing Windows will simply destroy any Linux on same drive.
      This is the final way, to see full performance and have all settings as Live version or VM may be limited or have own issues.

    How I moved

    My move to Linux actually took longer than just installing and using it.

    At first I started using open source software alternatives:
    E.g. Firefox or Chrome (instead of IE, Edge or Safari), LibreOffice (not MS Office), Double Commander (not Total Commander), GIMP (not Photoshop), Blender (for 3D modeling), VSCodium or QtCreator (not VisualStudio) etc.

    I’d recommend this website for finding alternatives of programs. There are other ways like even searching on internet.

    Then I even wrote a program to help me move and manage my coloring list to Double Commander.

    Also if I had other programs or bat scripts I would just replace them with new Python scripts (and I recommend this, instead of using .bat or .bash scripts since Python can replace both).

    I think I also built my fork of Double Commander since I’ve been using that, not the official version.

    I started rewriting my old Windows only audio player (still using DirectX and WinAPI learned at time of college) to use SFML and work on any Linux (or Windows if I needed). Thus I highly recommend writing your programs as cross platform, from start.

    Well at least I didn’t have to do anything with Stunt Rally because it was already working on Linux, thanks to 2 amazing contributors.

    That was then the moment I installed Debian and started configuring its look and any default behavior I didn’t like.


    📚Which distribution

    General info

    One thing that stands out with Linux for sure, is the multitude of its variants (distributions).

    • It has become great for desktop PC usage. Installers have GUI and are friendly.
    • Linux is the most popular for servers – i.e. PCs that don’t have a LCD monitor attached and run stuff all the time for other PCs in network.
    • Secondly it is also viable for embedded uses – so for a microcomputer with little power and memory. E.g. in OpenWrt.
    • And there is a special subgroup with Light-weight distributions, with small hardware requirements, and some minimal even work on old 486 CPUs.

    Wikipedia has some very good pages with not just history, but also useful information for general Linux knowledge.
    E.g. Linux distribution with general groups and info and lastly Linux and Linux kernel (quite technical).

    📄Distros lists

    For lists of distros:

    📑My list

    My quick list of just a few main popular ones:

    • Debian, with a strong commitment to free software principles, lets you chose which GUI. It is still my favorite.
      • Kubuntu based on Debian, with KDE (with lots of customizations), can look similar to Windows start menu, etc. I actually had couple of times serious issues with Apper not working. So I don’t see the point, when Debian with KDE is working.
      • Ubuntu, based on Debian, using GNOME,
        Is very easy to start. Seems to have lots of various software to install, but some have comments that don’t work or start.
        Definitely not for me because it is quite simplified and GUI is similar to Android or typical smartphone.
      • Linux Mint, based on Ubuntu.
    • openSUSE, has good GUI package manager YaST and some more tools too.
    • Fedora Linux, I don’t like the default GNOME. But rest seems okay for me.
    • Endeavour seems quite recent, popular and is based on Arch Linux. I didn’t see any GUI for packages, so I needed to use commands. But it has a nice menu helping with setup after install. But I did see few errors when getting some packages so I’m not sure.
    • There are (probably many) distros targeted at experienced Linux users, which require a guide and typing commands to install each component, like Arch Linux, or Gentoo where source code is compiled locally first.

    Why I chose Debian

    • I really like their philosophy, goals, and commitment.
      It is definitely something great for whole humanity (Linux and FOSS in general too).
    • It is one of the oldest, so it won’t disappear, or end suddenly.
    • It had the highest number of available packages.
      Well this isn’t the best factor, since there are many variants etc.
      And it doesn’t tell how often they are updated. Seems not so often.
    • It has a longer release cycle (2 years). But for me this is good. I don’t want to reinstall my OS often.
    • It allows few GUIs to choose from at install and supports many more.
    • It has many architecture variants (desktop x64 being just one of them), and can be used for embedded too. But surely others allow this too.
    • I used Ubuntu and Kubuntu before which are based on Debian and also used it at work for a year before moving to it.

    📈Which GUI aka Desktop Environment

    Well, going from Windows or MacOS, this is something new, right? Might be a bit shocking to be able to choose the whole GUI environment in same operating system to a different one (and other components too).
    A good wiki page for desktop environment with a small gallery.

    Examples can be split to 2 groups:

    And there are more, of course.

    ✨Why I chose KDE

    I chose KDE for the best look (for my desktop PC) and lots of customization.
    There is a KDE store website with gallery of various themes and look related.
    Here is a long video showing most of KDE theming options and another with extra features.
    I especially like that you can pick theme for various parts independently (like window borders, taskbar, icons, GUI controls inside windows etc.).

    There is also KDE app website – with apps that will be available, e.g. kdenlive for video editing.

    📦Packages

    ℹ️General

    This is something that Linux does IMO way better and is way ahead. I think it may have some cost of backward compatibility.

    Here is very good informational wiki page for package manager.

    It also has a section “Comparison of commands”, showing differences between:
    apt (Debian), dnf (yum) (Fedora), pacman (Arch), zypper (openSUSE), and more.
    Another such quick command help is on distrowatch.

    Because each major Linux (base) distro uses different package manager.

    GUI

    Usually Linux with GUI has some browsing applications with catalogues too.

    Depending on distro, one could be available like Synaptic, GNOME Software, YaST, etc.

    On my setup Debian with KDE it has even two:

    • Apper – has groups and then a big list of packages with some short info only. For example there are like 200 packages starting with lib, which are usually dependecies for other programs, and can be used in own programs too.
    • Discover – with more of a gallery type of applications and groups.

    Alternatives

    Well there is flatpak (flathub website with apps) and snapcraft, and these are different approaches for getting software working on Linux. Need some setup first for themself but after can get you needed software. I didn’t use them much yet, so I can’t write more.

    🔍Search

    There are websites for searching packages across many Linux versions (distros):
    pkgs.org and repology.org.

    Here is an example Debian packages page with contents and dependencies e.g. for doublecmd-qt and here is a list of all distros and their version of Ogre package.

    This way we can search for what is available on various distros. I find it useful for checking which package version is available and what it’s name is.


    ⌨️Useful commands

    Pages with lists

    There are very good pages, listing many commands and uses.
    For example:
    debian manual (seems quite old but very good), not too big
    ref card – pretty short reference
    kernel – full grouped list, very long
    man – another very long list
    busybox – a good list, it is specific to busybox subset of commands.

    Tab key does commands and files completion.

    My list

    Here is a helpful page about redirection and one for file/dir permissions.

    I’ve put here a short list of what I needed to use:

    man, info, help - for manual, and help, about commands
    cmd -h - command help for cmd
    
    pwd - show present working dir (folder)
    cd - change directory
    ls - list files (or devices), e.g. ls -l, ls -lA
    
    cp [source] [target/dir] - to copy
    mv - to move/rename
    
    rm - remove/delete, rm -r - recursive folder/
    mkdir, rmdir - create, remove folder
    
    chmod attr - change attributes e.g. 775
    chown username - change owner
    chgrp groupname - change group
    for all need to be owner or root
    
    cat - show contents, cat > file - type text to file
    more - with paging, less, q quit
    clear - clears terminal
    cat file | wc -c - size in Bytes
    
    wget http://file.. - download file from url
    
    tar xf file - unpack
    tar czf pack.tgz * - to pack all into tgz
    gunzip unpack file.gz
    
    cmd1 && cmd2 - runs cmd2 if cmd1 was okay
    cmd1 || cmd2 - runs cmd2 if cmd1 failed
    cmd1 | cmd2 - cmd1 output as input to cmd2
    
    >/dev/null - redirect to nofile
    2>&1 - forward std err into std out
    & at end - run in background
    
    echo test - write text
    sleep 1 - delay 1 sec
    
    find . -name *.html - search recursively for html files
    grep - match pattern, also: sed, awk
    
    uname -a - name, OS type 
    dmesg | grep tty - list serial devices 
    passwd - change
    
    su - become superuser (root), leave with: exit
    sudo - do as root, ctrl-D or exit
    who - for all users, id - you, whois
    
    lsof - list open files
    ps - list processes
    top - task manager, q quit
    
    ln - create link file
    type - show alias
    whereis - locate system files
    nano, vi - text based editors
    
    apt-cache search name - search for package name e.g. doublecmd
    apt-get install name - install package
    
    Ctrl+Alt+F1..F12 virtual terminal
    Ctrl+Alt+F7 exit

    🛠️Development

    In this chapter I have put some advice for those wanting to develop on Linux with C++.

    📜My history

    Long ago in 2003 I got this great IDE called Visual Studio at college and started developing with it in C++, I didn’t know any other and maybe saw few C++ IDE alternatives, which were less advanced. And before I was using Delphi 5 I think.

    After some time I was creating some of my first Windows programs and demos, using DirectX.

    So what’s wrong in this approach?
    Obviously VS is a MS product and they will show you their freaking technologies and promote their products only. It’s MS after all, that’s what they do, and also are known for monopolistic practices and all else.

    ⚖️Differences

    I describe here shortly the difference in my C++ development experience on Windows compared to Linux.

    On Windows there is vcpkg for C++ and only for C# there is nuget. I haven’t used them much.
    But for C++ if you don’t use vcpkg, or it doesn’t have the version you need, or it doesn’t work, then you are left to building all from sources. Okay, some big common libraries can be downloaded as SDK, or prebuilt binaries, has to be for your Visual Studio version specifically.
    But building from sources, especially every dependency too is a nightmarish, tedious, long process, with potential surprises that can cost even more time. As I described on Stunt Rally’s Windows build guide, aka the longest page there.
    Also there is MinGW and other ways that I didn’t try.

    On Linux, things are way easier. Most times you can just get needed dependencies as dev packages. The dev come with headers and libs that you use for building projects. And if some version is not recent, then you can build from sources.
    But building from sources is a pleasure on Linux. In most cases it likely means just entering some commands and waiting a bit until it ends. Sure, this is just my experience, nothing is perfect.

    Lately we started using Conan which is multi platform.

    ⚙️Common

    Regardless of IDE or not, there are some common things you’ll need to get for building projects from sources.

    It depends on project, because e.g. Python usually is already installed and you can start .py scripts already.

    But for C++ you will need a compiler like g++ (or clang, or other).

    So for example, on my Debian setup I usually start with:

    sudo apt-get install g++ binutils gdb git make cmake

    But there are also other alternatives or extras like: clang ninja-build clangd etc.

    No IDE

    Definitely possible and surprisingly common. Some key topics:

    And popular text editors:

    🖥️IDEs

    Here is a list of most popular IDEs. Some may be already present as packages. Others would need unpacking.

    • VSCodium
      Instead of VS Code which has telemetry etc.
      Pretty awesome (despite being MS). Looks great and is fast, searching is like almost instant in all files.
      Since it is an editor at start, it does need extra add-ons and possibly some setup to get it working as IDE for a language like C++, Python, or more. But I’d say in the end it is worth it since editing, comparing files and git integration are superb in it.
      My current list of extensions on C++ guide page.
    • Qt Creator
      This was my next choice and I still recommend it.
      Is a Qt product so best for their framework. But can be used not for Qt too. It’s a quite good IDE, fast, has CMake support already. Doesn’t have very many options or extensions. But it is easier to start with it for C++ with CMake, no extra steps needed (like for above one).
    • KDevelop
      I quickly looked at this IDE and it seems quite decent. Has features that every IDE should have. I just don’t see any IDE theme to turn it black fast after installing.
    • Eclipse IDE
      With CDT for C++ support. So at first I was using that, but I don’t recommend it. It is quite slow, uses Java, is very universal so needs extra steps for C++.

    ⌨️Shortest Samples

    🐍Python

    On Linux, Python is usually already installed.
    Here is a very simple script file simple.py

    
    import os
    
    print('Hello')
    

    It could be started by ./simple.py command in terminal.

    Developing in VSCodium / VS Code needs Python plugin, it will add commands like:
    Python: Run Python file in terminal
    Which can be bound to a key and will quickly open terminal and start current file.
    Debugging also works after adding a launch.json file.

    For my purposes this is enough, although help isn’t available.
    There are more advanced IDEs for Python like: PyCharm Community edition.

    ➕C++ with CMake

    This has moved to my C++ guide.

  • Microcontrollers

    ⏱️Overview

    This is my tutorial (or guide) on microcontrollers as a hobby.
    I am using simple English to make it easier to read for beginners and young people.
    I’m trying to make it educational and cover many topics, but shortly with links to Wikipedia and other pages.

    ℹ️What is a microcontroller

    Microcontroller (MCU for short) is one chip (IC) that already has all needed components inside:
    – a processor (CPU)
    – program memory, for code (Flash)
    – memory, for variables (SRAM)
    – pins (input / outputs, GPIO)
    – it usually also features few devices like:
    ADC, DAC (analog converters), SPI and other bus controllers, EEPROM, RTC (clock) etc. – more about them next.

    Microcontrollers are quite small, need far less current (power) and aren’t very fast (in computing), when compared to SoC (System on Chip, where memories are as separate chips).

    Being small and needing little power, makes them ideal as IoT and other devices that run from batteries.


    ⚙️Components

    I group and describe here (nearly) all microcontroller components (inside MCUs).
    If needed, many of them can also be added with chips or modules.

    🔨Basic

    ⚡️Power supply

    Let’s start with this, not really a component but important part.

    I don’t recommend 5V, unless you are a beginner and go with oldest Arduinos.
    It is complicated if you want to use it with 3.3V devices (a display, module or chip).
    Or generally have more voltages (5V and 3.3V) in one project.
    Converter is then required. And it is possible to damage (destroy) a component by accident.

    So, starting with 3.3V powered microcontrollers will cause less problems.

    Most MCUs use 3.3V for power. MCUs powered from USB (which has 5V) use a regulator that gives 3.3V.

    🔋Batteries

    Powering MCU form batteries is possible, but needs to be checked first.
    It is usually done through low drop LDO voltage regulators that give e.g. 3.3V for MCU.
    LDO means it will have less voltage difference by itself. They have some requirements though, need capacitors, etc.

    Example LDO: MCP1700T-3302E 3,3V, 6V max, 250mA current max, 1,6μA doing nothing, 178mV drop.

    A MCU can have power supply range e.g. for Bluepill🔵: from 2.0V to 3.6V max.

    • LiPo batteries are 3.7V, but 4.2V when fully charged, and can go down to 3.5V even.
      So they seem to be best with a LDO regulator to power 3.3V chips.
      Some MCUs can work from LiPo directly without regulators, like ATmega328P🔺 (from 1.8V to 5.5V).
    • It could be powered from 2 batteries (e.g. AA size) which are 1.5V (but more if new / fresh).
      Not ideal, since AA voltage (from capacity graph) goes down to 0.8V at end so they won’t be used fully here (best if MCU was from 1.6V).
    • Using LiFePO4 batteries, which are 3.2V (most of the time) could be an option too I guess.

    Either way you’ll have to use MCU (deep) sleep modes to minimize its power use
    and wake it up only at some intervals to do work or measurements.

    Additionally you could need a LiPo battery charger like TP4056
    and e.g. some diodes (best Schottky for low drop) to allow MCU working from either battery or power supply, and charging.

    💡LEDs

    One last remark, some white LEDs need higher voltage than 3.3V to light up fully, so it’s best to know it first.
    Otherwise it is possible to use a converter with a transistor to power LED from 5V.

    BTW of LEDs, there are cool calculators like this, or this, for computing needed resistor value (without it LED will be destroyed). Theory explained e.g. here.

    💻CPU

    Just like with a computer, the CPU it is a quite important component. Usually faster ones will need more power.

    There a few key parameters here:

    • CPU Frequency (with higher, CPU is faster and works / computes quicker).
    • CPU Bits. Old 8-bit CPUs can use 16-bit values, but will have trouble even with doing simple division. Still it may be just enough for some.
      For most cases 32-bit ones will be okay, for example if you read any value analog and want to scale it to display number.
    • FPU. Some CPUs can compute using floating point (real numbers, not integer).
      FPU is a dedicated unit that computes floats in hardware and so it is much faster.

    All CPUs have ALU (Arithmetic Logic Unit).
    For more advanced operations I recommend reading ALU Wiki (e.g. how to clear or set a bit).

    📍Pins (GPIO)

    A pin or GPIO (general-purpose input/output) is where you can connect:
    LEDs, switch buttons, potentiometers🎛️, rotary encoders, etc.
    More are needed at once for displays (SPI or I2C, even more for parallel) and for most modules.

    A pin mode (purpose) can be changed easily. It can be:

    • an Input (a button)
    • or Output (a LED)
    • or off, “floating” (High-Z state).

    It is also possible to configure input pull-up resistors (inside MCU) needed for e.g. switch buttons.

    It is quite important how many there are available when adding many components or modules.

    Notes

    Good thing is that buses (SPI, I2C etc.) allow more than 1 device attached. So e.g. you can have few chips that use SPI connected to the same SPI pins of MCU.

    Lastly, there are ways of making more outputs, for example by adding more chips:

    • parallel latch (e.g. 74HC573)
    • (serial) shift register (e.g. 74HC194, CD4094).

    But this means more trouble and more space. And it kind of breaks the benefits of having a microcontroller (it’s main advantage is having all in one chip).

    👉Touch sensing

    Some MCUs allow detecting finger touch on few pins.
    It is cool but isn’t something too awesome.
    If not present, you can do it anyway with 2 resistors or even just using ADC (advanced).

    Lastly, there are (expensive) dedicated chips for touch sensing if needed, e.g. MPR121 or AT42QT2100.

    PWM

    PWM (Pulse Width Modulation) can be used for example to change brightness of LED (or speed of a motor).
    Just having a pin as output (digital) will make a LED full on (bright) or turned off.

    PWM uses much higher frequency than human eye can see (e.g. 10kHz). So for LED brightness no filter is needed.

    It is cheap and many MCU pins support it.

    PWM with RC filter

    PWM also allows a cheaper way of making an analog signal.

    Best way of having an analog output is from a DAC (special converter), but these are quite expensive.
    Still, for (good quality) audio outputs DACs may still be the best / only option.

    PWM output is still digital, but using a simple RC filter (with Resistor and Capacitor) you can turn it into analog.
    More info on PWM Wiki.

    It isn’t the best (cleanest) analog signal though, and you don’t really get much bandwidth (not for high frequencies).
    RC filter is used to make it smoother (get rid of PWM modulation) with higher R,C values, but passing less higher frequencies from signal.

    Links: Calculator for RC filter values, and
    another, better one – great for showing modulation noise (peak-to-peak ripple value, response graph).

    🛠️Medium

    📈ADC

    ADC (analog to digital) converters are quite common in MCUs.
    Usually there are 1 or 2. But more inputs (pins) can be used to read. MCU selects just one at a time.

    ADC for example for 12 bit, converts input pin voltage 0 – 3.3V to a 0 – 4095 value, (4095 = 2^12 – 1) after short conversion time.

    📉DAC

    DAC (digital to analog) converters are not that common in MCUs.
    Cheap, old or low power MCUs will not have them.

    E.g. a 12-bit DAC’s output pin will have analog voltage 0 – 3.3V from a 0 – 4095 value, after short conversion time.

    Converter bits

    Even if MCU has a converter (ADC or DAC) it usually won’t have much resolution (usually 10 or 12 bits).

    This is because with more bits, they need cleaner power supply (otherwise it will just have the same noise)
    and this is difficult to do inside MCU, so close to CPU 😀.

    Other thing is how many bits will be useful. E.g. it may happen that from 12 bit ADC, 2 bits are noise.
    This is a practical thing to check and likely won’t be written in specs.

    ADC or DAC chips, for 16 bits and good quality aren’t cheap.

    ADC and DAC can be both inside a codec chip, possibly also with an audio amplifier.
    Codecs save space but aren’t best in quality.

    EEPROM

    EEPROM is the kind of memory that permanently stores data.
    In other words, it remembers what it has after turning it off.

    This makes it rather necessary if you have any configuration or parameters you want to keep after user changes it.
    Sadly not all boards or MCUs have it, and usually there isn’t much of it, in bytes.

    But if you have SPI bus (and want to go into this trouble) you can attach a separate chip with serial EEPROM e.g. 25LC256 (64 kB).

    Of course if you use a SD card (for SPI) then EEPROM isn’t needed. SD cards have a lot of (storage) room, but are expensive.

    ⏰RTC (Clock)

    RTC (real-time clock) counts time (seconds, minutes, hours) and date accurately.
    It usually needs an extra 32 kHz crystal. And a 3V battery to keep working when MCU is off.

    Generally RTC is present (like DAC) in newer MCUs.
    So when a MCU isn’t cheap, old, or very low power, it features a basic RTC already inside.

    For those microcontrollers that don’t have it (or for more RTC features like alarm), an external RTC chip can be used.
    E.g. DS1307 or DS3231 (there are a few others), they need I2C bus.

    ⚙️Advanced

    ⏲️Timers

    Generally when coding, there are some classes or methods to deal with timing on higher level (given interval).
    If so, then knowing the details of timers in MCU isn’t needed. But when going closer to hardware, it usually is good to read about what is possible in technical specifications (e.g. some 8-bit MCU can have just one 16 bit timer).

    If used manually they need setting up counter value, which decreases (with CPU Frequency, possibly scaled first)
    and generates interrupt (calls your short procedure) every time it reached zero.

    DMA

    DMA (Direct Memory Access) allows CPU to run your code, while at the same time memory is being transferred.
    DMA transfer needs to be set up first by CPU (few parameters set).

    One example would be using LCD display: CPU does (computes or draws) something
    while DMA unit reads screen memory buffer and sends it to SPI display.
    This way is fastest and optimal.

    Interrupts

    An interrupt means CPU stops running normal code and
    jumps to executing interrupt procedure (usually very short code to deal with this interrupt type).

    Interrupts can happen:

    • internally – e.g. after ADC finished conversion or DMA transfer ended)
    • or externally – e.g. user presses button, changing GPIO input level).

    ↔️Buses

    A bus is simply just a set of wires (with given names and purposes),
    for transferring data (sending and/or receiving bits and bytes).

    The more advanced (and expensive) a MCU is, the more bus types it has, and more than 1 of each type are available.

    USB

    Having USB on MCU board is usually very good:

    • Uploading your code into MCU is super easy, you just plug in a USB cable to board and into PC USB and then upload.
      No need for the other board (programmer or serial converter).
    • MCU can become a USB device (e.g. send (receive) data to PC, be a keyboard, mouse, joystick etc.).
    • Some MCUs have a USB connector but don’t allow above (uploading and being a device).
      And only allow host devices to be plugged in, e.g. connecting a keyboard or mouse to MCU.

    So it is best to check first. Also few USB variants are present. They have different transfer speeds and current (power) limits.

    SPI

    SPI uses 4 wires and is meant for fast devices like: displays or SD cards, various devices, chips, etc.
    Transfer rates e.g.: 8, 16, 24, 30, 60, 80, .. Mbit/s.
    SPI wires are named: MOSI, MISO, CLK, SS (or CS, chip select).
    Displays can have additional signals e.g. D/C, RST.

    I2C

    I2C is slow, but only needs 2 wires (named: SDA and SCL).
    Transfer rates e.g.: 100, 400 kbit/s, 1, 3.4, 5 Mbit/s.

    Some displays work with I2C. If a display is also available for SPI, then using I2C means it is slower (to refresh) but needs less pins.

    I2S

    I2S is meant for sound devices and needs 3 wires.

    UART (serial)

    UART and similar USART.
    USB to UART converter is used to program ATmega MCUs that don’t have USB (with this converter on board).

    UART can be used for the Serial monitor (or e.g. Putty) as COM port in PC, to print text messages while MCU is working.

    RS-232 and RS-485 exist since long, have very many devices and usages, and long cable range, but very slow rates.

    Other

    There are also other buses.

    For example: DS18B20 temperature sensor uses 1 wire bus and so it needs additional library (more flash code).

    CAN is industrial and popular in vehicles.


    ⚖️Comparison table

    In following table I gathered most important MCUs, only smallest and IMO worth mentioning.
    If there is a bigger variant or more expensive one I’m not adding it.
    I listed key parameters in columns (scroll right to see all).

    RowBoard name💰Price $🖥MCU (chip)⏱CPU MHz⭐️Rating (5 max)CPU bitsARM CortexFlash kB (code)SRAM kB (memory)📍Pins GPIO📩EEPROM BytesUSBSPI (Mbit/s)📉 ADC bits📈 DAC bitsBoard name
    18 pin chip~1.5ATtiny852018 🐢80.55 😡512no1x1x 108 pin chip
    2Arduino Nano🅰️~3 to 10ATmega328P163 💫8 🐢322141024yes2x1x 10Arduino Nano
    4STM8S~2 to 10STM8S103F3P61628 🐢M08116640no1x (8)1x 10STM8S
    5Bluepill🔵~2STM32F103C8T6724 ✨32
    M3642033no2x (18)1x 10Bluepill🔵
    6Blackpill⚫️~4STM32F4111003 ✨32M451212832yes5x (50)1x 12Blackpill⚫️
    7Nucleo-L432KC⚪️11 😡STM32L432KC
    80232M42566420 to 26?yes2x1x 122x 12Nucleo-L432KC⚪️
    8ESP32📡~7 to 11Tensilica Xtensa LX6240 x25 🌟324096 – 819252034yes4x (80)1x 122x 8ESP32📡
    9Teensy 3.220 😡MK20DX256VLH772132M425664342048yes1x (30)2x 131x 12Teensy 3.2
    10Teensy 4.0⏩20IMXRT1062DVL6A600 😱4 🌟32M719841024 (512)401080yes2x (60,80)2x 14Teensy 4.0⏩
    _____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Notes

    Prices with ~ are from AliExpress if available. I am using icons for few boards, to easier spot them around here.
    I would recommend boards with my Rating having stars (3 or higher).
    I marked with 😡 really bad things. Well, for me not having an EEPROM (or too little) or DAC is also bad.

    The slowest 8 bit have 🐢 mark. They are really ancient history🏛️, compared to 32 bit ARM. But yeah, for some uses still enough.
    Cortex M4F (and higher) has float type, M4 does not (also some info here). Cortex M7F has double type.
    Meaning all below M4 have only integers.

    Regarding memory it is good to know that constant program memory can also store data like fonts, images etc.
    And differences between stack and heap, explained here or here.

    Of course to really compare how fast MCUs compute you’ll need to check benchmark results, but CPU MHz is a good start.

    USB yes in table means you can program it from USB.

    SPI Mbit/s speed affects how fast a display could be updated (if display allows), but CPU MHz too (if not using DMA).

    ESP32 has a lot of variants so it can have different values in table.


    👉How to start / My Recommendations

    Here are my recommendations on how to start a hobby with microcontrollers (or develop it further).

    There a many factors here.
    All depends on your knowledge, education or experience so far, free time and determination, age, money, expectations etc.
    And lastly preferences, since you could already prefer some MCU.
    (e.g. having already experience with Arduino, wanting WiFi present in ESP32📡, or Teensy boards which are quite popular for sound effects).

    I’ve also put a section below with Showcase (projects and videos). It’s fun to watch and good to get inspired.
    Just keep in mind that: the more time you watch, the less time you spend creating your own.

    Beginner

    For someone who does not know the topic of microcontrollers or electronics.

    For beginning (especially alone), it is important to: not get stuck,
    have easy steps to move forward and have fun with each step.
    That is why recommend here the most popular boards and tools.

    I would recommend buying an Arduino Nano🔺 (cheap clone on AliExpress)
    and then installing and starting with Arduino IDE, to program it.

    Then following a video tutorial exactly, like this slow one, or the better fast one.

    Once you have a MCU and IDE working it’s up to you what to do next.
    And I’d say doing what you find most interesting or fun.

    I don’t recommend expensive boards at start. Loosing money on something that will just gather dust isn’t fun. This may happen if some step is too difficult (makes trouble) or other hobby (or addiction) takes over.

    Medium

    For those having some experience already and/or more determination, I would recommend starting with:

    • either STM32 boards (Bluepill🔵, Blackpill⚫️) with required programmer (STLink V2) as they are cheap on AliExpress,
      video guide e.g. here or here.
    • or even with ESP32📡 as it has USB (no programmer needed),
      website with guide e.g. here or official here.

    And starting inside Arduino IDE (to get going quickly).
    Once done and working, I would later recommend moving to VS Code (e.g. with Arduino extension).

    Expert

    As an expert I recommend using VS Code already for IDE (or other) and either using a Makefile or CMake.
    This way build is just normal and makes it easy to have many files in your project (it does not limit you making bigger projects).
    And you get a decent IDE with features that professional developers use too.
    Also using Git for your projects will allow better history and changes managing.

    For example: I am using Teensy boards and made a Makefile (based on other examples).
    Then I’ve put together libraries (found on GitHub) for the components I needed (especially the optimized one for display, using DMA).

    Sure, it is not that easy as using libraries from Arduino IDE.
    But at least you don’t have just 1 .ino file and you can add many files, subdirs or libs in your project.
    It is easy to navigate inside libraries and edit them too.

    Professional

    Well just for info. None of this matters for a hobby.
    Given time constraints and requirements (someone else’s) this could be stressful and not fun at all.

    As a professional you would likely: have product requirements, then pick closest / cost effective MCU chip for it (with needed speed and components). Having a chip you would manufacture a PCB (by yourself or from a PCB making company).
    Then develop software for it to cover just the requirements, effectively.
    You could maybe use some bigger (expensive) development boards first, if available for that MCU family.
    It is a really long way, to later make profits, when mass producing your product (by a company).


    🔗Links

    📚Specifications

    ESP32

    ESP32 – with all ESP32📡 related (lots of links).
    ESP32 Wiki

    Teensy

    Teensy 4.0⏩ – The fastest one now.
    Teensy specs – table comparing all Teensy boards.

    STM

    Blackpill⚫️, Bluepill🔵, Nucleo L432KC⚪️, 8 bit: stm8s103f3

    ATmega

    ATmega328P🔺, ATtiny85 – the slowest.

    📃Projects showcase blogs

    Hackaday projects – lots of advanced projects.

    Teensy blog – lots of advanced projects, based on Teensy boards only, Teensy forum.

    ▶️Showcase videos

    educ8s.tv – many various projects and tutorials.
    cbm80amiga – many projects with fast display
    GreatScott projects – mainly Arduino

    ESP32📡

    How to add WiFi Control to any project || ESP32 Beginner’s Guide
    ESP32 FTP Client, download files in SDCARD
    ESP32 WiFi Weather Station – with Nextion display, old
    ILI9341 TFT LCD to ESP32, SD card and Touch – with tutorial
    Solar Weather Station, ESP32, SIM800L sending to WEB Server over WiFi/GSM

    Teensy 4⏩

    My demos on Teensy 4.0, with ILI9341 320×240 display – 45 Fps
    My demos on Teensy 3.2, with ST7735 160×128 display – ~20 Fps
    All my videos, Teensy with displays and keyboard related

    3D graphics on Teensy 4.1 part 4 – wow
    Teensy4.0 + ILI9341 running Atari 520ST emulator
    Get better DSLR audio control with a Teensy-based mic monitor

    STM32🔵

    3D Filled Vector Graphics on STM32 Follow-up – ST7789 and new features
    Smooth video playback on STM32 and ST7735

    ATmega328🔺

    Arduino Datalogger with GUI update, DS3231 support – great project, with Nokia 5110 LCDNokia 5110 LCD – the oldest LCD with tutorial
    ILI9341 fast SPI library optimized for 16MHz AVR Arduino – amazing fast
    SSD1306 Display Test – OLED – 8 Fps for I2C – 25 Fps for SPI, just comparison
    ST7735 ATmega328 Intro – fast, demo
    ILI9163/ST7735 – very old, but shows color modes (12,16,18 bits)

    ▶️Video Guides, Tutorials

    Andreas Spiess – has many videos and playlists (for some reason playlist links are S̶t̶r̶i̶k̶e̶-̶t̶h̶r̶o̶u̶g̶h̶ here).
    E.g. for ESP32 with Arduino, STM32, Bluetooth, LoRa and more.

    #214 New: Easier ESP32 installation in Arduino IDE (How to)
    #345 ESP32 vs STM32: Which one is better (Bluepill)

    Kolban Technical Tutorials for ESP32 – with many modules.

    BnBeClub – various projects and electronics tutorials.

    GreatScott – Electronic Basics – general electronics tutorials.

    Shawn Hymel Presents: Introduction to RTOS
    a good advanced tutorial about RTOS (operating system, also used in ESP32).

    🔋Battery related

    #193 Comparison of 10 ESP32 Battery powered Boards without display (incl. deep-sleep)
    How to power the 3.3V ESP32 from a 3.7V Li-ion battery
    #351 10 Battery Power Boards for Raspberries and ESPs
    ESP32 Deep Sleep Tutorial for Low Power Projects

    🖥️Library links, for displays

    ILI9341_T4 for Teensy 4
    ILI9341_t3n
    ILI9163C display, fast
    ST7735_3d_filled_vector for STM32
    ST7735 display, fast for Teensy

    cbm80amiga – optimized for many displays
    Nokia-5110-LCD-library
    SSD1306 OLED
    Adafruit-GFX-Library base drawing library


    🖥️Displays

    There are many others, I listed those which I recommend. (I already used 2 to 4 in my projects).

    RowType🖥Controller chip💰Price $Size, InchSize, cmWidth, XHeight, YColors, bitBuffer size kB
    1LCD B/W😡Nokia 5110, 33101.5-2.51.7?4.3?84481504 B
    2OLED, I2C or SPISSD1306~20.96″-1.3″2.51286411
    3LCD, SPIST77354-51.8″4.516012816 (12, 18)?40
    4LCD, SPIILI93418-92.4″, 2.8″6.1, 7.132024016150
    5LCD, SPIILI9486
    ILI9481 IPS
    10-123.5″8.948032016300

    Prices are from AliExpress. No need to waste more money for same thing, if you are okay with waiting more.

    Size – is the diagonal length (in inches and centimeters).

    Resolution is simply width (X) by height (Y) in pixels (or other way if you prefer).

    Colors – 1 bit means mono. OLEDs are available as blue, white or even part orange part blue.
    For 16 bit (1 word) this means RGB565, so Red, Green, Blue color components use 5, 6, 5 bits respectively.

    Updating

    In my projects I always want smooth drawing without flickering, so full screen is always updated.

    You don’t need this way, in fact, there are plenty of videos and projects where a bigger display is used and it is updated slowly and/or partly each time.
    Personally I really don’t like the blinking and slow updates.
    But if you’re okay with this you can skip the rest here.

    Buffer size

    The last column Buffer size is how much memory you would need to have whole display buffer on MCU (in SRAM).
    This is computed as: width * height * bits / 8. For example (row 3 in table): 160 * 128 * 16 / 8 = 40960 B = 40 kB (k is 1024).

    For this, I use a MCU that has more SRAM than this buffer size for chosen display.
    For example the 160 x 128 display needs 40 kB and I used it with Teensy 3.2 which has 64 kB SRAM.

    I also like to have at least double that. This way I can do double buffering:
    meaning CPU draws in one buffer, while DMA reads the other buffer and sends to SPI as fast as possible.


    📻Radio and network

    LAN and WiFi allow local network or internet access for MCU.
    The rest needs at least 2 modules (and 2 MCUs) to communicate with each other.

    LAN

    Internet or local network access is possible using Ethernet modules.
    They use SPI on microcontroller and have a RJ45 connector which needs a cable plugged to a switch or router.
    Seems complicated and less popular.

    WiFi

    Wi-Fi Is quite popular. ESP32📡 boards already have it, and use separate CPU core for it.
    Other microcontrollers can access network with WiFi modules.

    LoRa

    For long range, but very slow transmission speeds. No paying, no need for SIM card makes it great.
    Andreas Spiess has many videos on this topic.

    Bluetooth

    Bluetooth is short range (up to 10 meters), so likely for in house (in car) use only.
    There are Bluetooth modules for it.
    Many common devices already use it (e.g. for audio) and it has a big standard too.

    Radio Frequency modules

    RF modules are quite cheap and libraries for them are available.
    For example: 433 MHz (need bigger antennas) or 2.4 GHz (already have small antennas) nRF24L01+.
    I think they are best for custom remote controllers and sending data, when IR (infrared) is not enough.


    📊IDEs (code/program editors)⌨️

    An IDE (Integrated Development Environment) is the PC program where you spend time:
    editing your program / code for MCU, building it, and best also uploading.

    Naturally, it needs to be a nice experience.
    So IDE should help you doing your thing, and not making it difficult to do something.

    Of course you could do it all in separate programs but it needs more switching and is way more inconvenient
    (e.g. I did edit code in VS 2008, build in cygwin and upload using Teensy loader app).

    I only list 3 IDEs here.
    Those which are Cross-Platform (i.e. will work on GNU/Linux, Windows or Mac)
    and are (at least) free to use.

    There are many more possible, and some only for Windows, which is bad especially if a MCU producer requires you to use it.

    I wrote good and bad things for them, of course from my point of view and experience.

    Arduino IDE

    I mean the old 1 version. IMHO, this shouldn’t be really in this list, as it isn’t an actual IDE, for me it is just a better notepad.
    But it is (still) really popular and quite easy to start.
    Seems to be standard basic “IDE” for few MCUs (or only one supported).

    ✅Good

    • Very popular
    • Comes with many libraries and examples (mainly for Arduino boards).
    • Supports lots of boards with extensions.
    • It can find and install more libraries, boards and examples for them
    • Has serial monitor (console for printing) and even serial plotter for graph.
    • Plenty of documentation and guides e.g. how to start, official website.

    ❌Very Bad

    • No IDE features: jump to definition, code suggestions, find references…☠️
      So it doesn’t allow learning from code.
    • All source in 1 file (.ino)
    • Primitive / basic / ugly look. No skins / themes.
    • Has almost nothing in Preferences.
    • Needs Java.
    • Other reasons to not use it here or older here, e.g. no debugging support.

    ✔️Conclusion

    So I’d say: it is okay to get you started fast. But I’d recommend going away from it, as soon as possible.
    If your program is more than 100 lines or you want to enjoy and learn programming, then don’t use it (for long).

    VS Code / VSCodium

    This is my recommendation. At least for code editing.

    Using Arduino extension in it, makes Arduino IDE obsolete. Well, if it works for you, since many complain about bugs.
    Still it requires Arduino to be installed as is uses its tools, compiler etc.

    ✅Good

    • A really awesome editor, that can be turned into full IDE.
    • Fast Git committing and pushing.
    • Extremely fast search in files.
    • Integrated diff features all from editor when comparing.
    • Smooth layout display and themes.

    ❌Bad

    • Needs some effort to set up.
    • Needs many extensions to be great e.g. C/C++, Git.
    • Not much in main Menu and no icons in it.
    • Plenty of options in long scrollable “website like” form, easy to get lost.

    Eclipse based

    ✅Good

    • Popular and it works (since a long time).
    • Has many variants, for specific MCU or language.
      E.g. Ac6 System Workbench for STM32 bluepill on openstm32 website (needs creating account to download).
    • Preferences with tree view like in Visual Studio (but it still doesn’t remember its size).

    ❌Bad

    • Slow
    • Rather old look
    • Needs Java
    • Somewhat complicated IDE (is also for Java, C++ with CDT, Python etc.)
    • Also no icons in main menu

    Web based editors

    I don’t recommend writing code for your MCU on a website. Honestly I can’t see it as a good life time solution.
    The only reason I see for it, is that for some people, it could be easier to start coding and using MCUs on a website that already works (especially if shown by someone in video or IRL) instead of installing and configuring an IDE. But setting up an IDE is an investment that will pay off.

    🧪Other developer topics

    🐍Python

    Lastly some MCU boards support coding in MicroPython. But it has high requirement for flash memory, and IMHO even if not interpreted (as Python), it has to be slower or bigger than C/C++ code.
    But perhaps it is a way of doing some complex things faster (still, there could be some C libraries for them too).
    Python is great for general PC scripts though (instead of bash or batch) where speed does not matter.

    ⚙️Debugging

    I can say from my experience that this feature is not really needed, even for complex MCU code and projects.
    I have developed K.C. and K.C.4 without it, on Teensy (it doesn’t support debugging).

    If you do bad stuff in code, MCU crashes (stops). It is easy to tell, mostly right after start, and guess that what you added or changed was bad.
    More trouble is when you don’t see anything. Then having a simple LEDs, Logic analyzer, or Oscilloscope (very expensive) can help understanding what happens on pins. And I also recommend adding some code to set pin for LED to light up, to know where you could go wrong in code.
    Of course with working serial monitor and text prints it is easy too.

    Still, debugging is a useful feature, especially for advanced topics.
    STM32 allows simple SWD debugging (stepping and registers) with STLink v2.
    Bigger, expensive boards have JTAG connector and allow full debugging.

    🧵Threads, FreeRTOS

    Normally you can do most programs on MCUs (especially older ones) without an RTOS / operating system (using just 1 main thread and interrupts).

    For example: my keyboard firmwares K.C. and K.C.4 have main loop filling display buffer (then DMA sends it to display via SPI), and timer interrupt doing key matrix scans at 1kHz (can be changed) with a rare, slower 1-wire temperature sensor reading. It still works well on bare-metal, without FreeRTOS.

    But if your project / program does many things at once, then it is probably time to use FreeRTOS. And get familiar with concepts of threads and synchronization, especially if you’re seeing issues. It is an advanced topic though.

    I think a good video tutorial series for it is: Shawn Hymel Presents: Introduction to RTOS.
    And also the big FreeRTOS documentation.