Skylicht Engine is C++ Game Engine based on Irrlicht 3D. And my goal is to create a high-performance and lightweight Game Framework that can seamlessly function on both web and mobile platforms. This framework will be available to everyone for free.
771
stars
2,520
commits
C++
primary language
Sep 15, 2026
updated
Skylicht Engine is an evolution of the Irrlicht Project. We have upgraded many features, including Sound Engine, Physics Engine, Particle Engine...
Core functionality: Direct3D11, OpenGL 4+, OpenGLES 3+, Google Angle GLES video driver backends.
Cross-Platform Framework: Android, IOS, Win32/Win64, UWP, Linux, MacOS, HTML5.
Render pipeline: Forwarder & Deferred.
Skylicht Engine is a super lightweight Game Engine that targets mobile platforms (Android, IOS). And, it's completely free.
# call 'git lfs pull' after checkout
git lfs pull
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildAssetBundles.py
C:\skylicht-engine\Assets>cd ..
# Visual Studio 2019
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 16 2019" -A x64
# Visual Studio 2022
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64
# Xcode
/User/Skylicht/Documents/skylicht-engine$cmake -S . -B ./PrjMac -G Xcode
# Linux
$ skylicht-engine$ cmake -S . -B ./PrjLinux -G "Unix Makefiles"
Open the generated solution PrjVisualStudio/SKYLICHT_ENGINE.sln
Once the solution opens, right click the SampleXXX project, click "Set as StartUp Project" and click the play button at the top to run the Demo App.
More details: please preview command in BuildCommand folder.
# Install Tinydb
# https://pypi.org/project/tinydb
C:\skylicht-engine>C:\Python37\Scripts\pip install tinydb
# Install Pillow (Image processing)
# https://pillow.readthedocs.io/en/4.1.x/index.html
C:\skylicht-engine>C:\Python37\Scripts\pip install Pillow
# Compress TGA to DDS, ETC2 texture
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildTextureCompressDDS.py
C:\skylicht-engine\Assets>python BuildTextureCompressETC.py
C:\skylicht-engine\Assets>cd ..
# Install pcpp (C Preprocessor tool)
# https://pypi.org/project/pcpp
C:\skylicht-engine>C:\Python37\Scripts\pip install pcpp
# Build shader script
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildShader.py
C:\skylicht-engine\Assets>cd ..
// Assets\BuiltIn\Shader\Shadow\GLSL\LibShadow.glsl
#define HARD_SHADOW
// #define PCF_NOISE
And re-build the shaders
# Build shader script
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildShader.py
C:\skylicht-engine\Assets>cd ..
Projects/{ProjectName}/Source and regenerate projectC:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64
C:\skylicht-engine>python Scripts\create_project.py NewApplication Samples\NewApplication
# BuildAndroidNDK.cmd
# Set your pc folder, example
set MINGW=C:\MinGW\bin
set NDK=C:\Android\android-ndk-r26d
...
# Make folder jniLibs on Android Project
C:\skylicht-engine>mkdir Projects\Android\app\src\main\jniLibs
C:\skylicht-engine>mkdir Projects\Android\app\src\main\jniLibs\armeabi-v7a
C:\skylicht-engine>mkdir Projects\Android\app\src\main\jniLibs\arm64-v8a
# Copy result native ndk (from step 1) to jniLibs
# Project SampleSkinnedMesh
C:\skylicht-engine>copy Bin\Android\Libs\arm64-v8a\libSampleSkinnedMesh.so Projects\Android\app\src\main\jniLibs\arm64-v8a
C:\skylicht-engine>copy Bin\Android\Libs\armeabi-v7a\libSampleSkinnedMesh.so Projects\Android\app\src\main\jniLibs\armeabi-v7a
C:\skylicht-engine\Assets>python BuildTextureCompressETC.py
C:\skylicht-engine\Assets>python BuildAssetBundles.py
C:\skylicht-engine\Assets>cd..
Android APK:
C:\skylicht-engine>SET ASSET_PATH=Projects\Android\app\src\main\assets
Android AAB: Assets will be copied to assetPack: appdata
C:\skylicht-engine>SET ASSET_PATH=Projects\Android\appdata\src\main\assets
And copy command
# Copy built-in asset
C:\skylicht-engine>copy Bin\BuiltIn.zip %ASSET_PATH%
# Copy project asset
# Project SampleSkinnedMesh
C:\skylicht-engine>copy Bin\Common.zip %ASSET_PATH%
C:\skylicht-engine>copy Bin\SampleModelsResource.zip %ASSET_PATH%
# Dont forget copy ETC texture
C:\skylicht-engine>copy Bin\SampleModelsETC.zip %ASSET_PATH%
Open Android Studio and import project Projects\Android
Run command build from Android Studio:
# Grant permission executive for PVRTexTool
skylicht-engine/Tools/PVRTexTool/darwin$ chmod +x PVRTexToolCLI
# Build compress texture ETC
skylicht-engine/Assets$ python3 BuildTextureCompressETC.py
# Build asset bundles
skylicht-engine/Assets$ python3 BuildAssetBundles.py
If you want build samples for iOS device, you should replace the bundleIdentifier in Samples/{ProjectName}/CMakeLists.txt.
elseif (BUILD_IOS)
# replace your application name
set(MACOSX_BUNDLE_EXECUTABLE_NAME SampleHelloWorld)
set(APP_NAME "SampleHelloWorld")
# replace your bundleIdentifier
set(APP_BUNDLE_IDENTIFIER "com.skylicht.helloword")
set(CODE_SIGN_IDENTITY "iPhone Developer")
else()
And generate iOS xCode Project by this script.
# generate project for iOS device
skylicht-engine/BuildCommand$ ./GenerateXCodeIOS.sh
# or generate for iOS simulator
skylicht-engine/BuildCommand$ ./GenerateXCodeIOSSimulator.sh
Open iOS XCode Project on folder skylicht-engine/PrjIOS/SKYLICHT_ENGINE.xcodeproj
Note: iOS Simulator is not yet support compressed texture and hardware skinning.
Skylicht Engine can be compiled into a standalone library to simplify integration into other projects.
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64 -DINSTALL_LIBS=ON -DBUILD_SHARED_LIBS=ON
C:\skylicht-engine>cmake --build ./PrjVisualStudio --target install --config Debug
Note: Use the parameters "-DINSTALL_LIBS=ON -DBUILD_SHARED_LIBS=ON" with cmake command
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64 -DINSTALL_LIBS=ON
C:\skylicht-engine>cmake --build ./PrjVisualStudio --target install --config Debug
And then copy the resulting InstallLibs folder to another project. See the project example: https://github.com/skylicht-lab/hello-skylicht See the API Reference
// INIT SCENE FUNCTION
// init scene/zone
CScene* scene = new CScene();
CZone* zone = scene->createZone();
// camera
CGameObject *camObj = zone->createEmptyObject();
CCamera* camera = camObj->addComponent<CCamera>();
camera->setPosition(core::vector3df(0.0f, 1.5f, 4.0f));
camera->lookAt(
core::vector3df(0.0f, 0.0f, 0.0f), // look at target position
core::vector3df(0.0f, 1.0f, 0.0f) // head up vector
);
// load model
CMeshManager* meshManager = CMeshManager::getInstance();
CEntityPrefab* meshPrefab = meshManager->loadModel("SampleModels/BlendShape/Cat.fbx", NULL, true);
// load material
CMaterialManager* materialMgr = CMaterialManager::getInstance();
// search textures folder
std::vector<std::string> textureFolders;
// use Skylicht Editor to edit .mat file
ArrayMaterial& catMaterials = materialMgr->loadMaterial("SampleModels/BlendShape/Cat.mat", true, textureFolders);
// create 3d object
CGameObject* cat = zone->createEmptyObject();
cat->setName("Cat");
cat->getTransformEuler()->setPosition(core::vector3df(0.0f, 1.0f, 0.0f));
// add render mesh component & init material
CRenderMesh* meshRenderer = cat->addComponent<CRenderMesh>();
meshRenderer->initFromPrefab(meshPrefab);
meshRenderer->initMaterial(catMaterials);
// update scene (1 frame)
scene->update();
// render scene to screen
CForwardRP* renderPipeline = new CForwardRP();
CBaseApp* app = getApplication();
u32 w = app->getWidth();
u32 h = app->getHeight();
renderPipeline->initRender(w, h);
// RENDER TO SCREEN FUNCTION
renderPipeline->render(
NULL, // render target is screen
camera, // the camera
scene->getEntityManager(), // all entities in scene
core::recti() // the viewport is fullscreen
);
Engine Components are used:
This demo is to draw Cube 3D, set up, transform and use components.

This demo code renders a 3D sphere, loads textures (Diffuse, Normal, Specular), and binds a SpecGloss shader to the material.

This demo code renders a Sci-fi Helmet, loads textures (Albedo, Roughness, Metal, AO, Emissive), and binds a Physically Based Rendering (PBR) shader to the material.

This demo code shows how to bind a shader to a material.

Engine Components are used:
This is an example of how to render a character model with animation. The models are downloaded from mixamo
This is a demo on how to use the UnwrapUV tool to create Lightmap UVs. Library xatlas is integrated to Skylicht Engine.
This is a demo showing how to use the lightmapper to bake indirect lighting colors onto a lightmap texture. Project references: Lightmapper
Result lightmap
Indirect lighting on Sponza baked by Skylicht Lightmapper.
This example is how to set up a simple lighting & lightmap. This scene uses basic diffuse bump specular shader.
Run on Ubuntu 20.04

This is a demo on how to use the lightmapper to apply indirect lighting color to vertex color.
Engine Components are used:
Irradiance baked on Vertex Color:
This is a demo to use CollisionManager to get collision point from the ray.

And how to query all triangles inside a Box

And how to use the decal projector feature

This is a demo on setting up the rendering of many mesh instances to optimize draw calls and rendering performance.
This is a demo of drawing many characters and animations using the GPU Instancing technique.

Skylicht Particle Component is a cleanup version of SPARK. We have optimized by GPU Billboard Instancing.
This is a demo showing how to create a particle system and use imgui
This is a demo code on how to use a simple projectile, impact, trail particle, sub emitter system.

This is demo code how to use noise library shader to make vfx effect, particle turbulence.
Welcome if you want to contribute your code to Skylicht Engine (Ex: add feature or fix bug). Wellcome to join the group. Open an issue and submit a pull request to this repository. Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.
Skylicht Engine is licensed under MIT License
Skylicht Engine is based in part on the work of:
This means that if you've used the Skylicht Engine in your product, you must acknowledge somewhere in your documentation that you've used. It would also be nice to mention that you use the 3rd parties library... Please see the README files from 3rd parties for further information.
Thanks, Project Maintainer: Pham Hong Duc
C++
67.4%
C
27.5%
HLSL
1.8%
GLSL
1.6%
Skylicht Engine is C++ Game Engine based on Irrlicht 3D. And my goal is to create a high-performance and lightweight Game Framework that can seamlessly function on both web and mobile platforms. This framework will be available to everyone for free.
771
stars
2,520
commits
C++
primary language
Sep 15, 2026
updated
Skylicht Engine is an evolution of the Irrlicht Project. We have upgraded many features, including Sound Engine, Physics Engine, Particle Engine...
Core functionality: Direct3D11, OpenGL 4+, OpenGLES 3+, Google Angle GLES video driver backends.
Cross-Platform Framework: Android, IOS, Win32/Win64, UWP, Linux, MacOS, HTML5.
Render pipeline: Forwarder & Deferred.
Skylicht Engine is a super lightweight Game Engine that targets mobile platforms (Android, IOS). And, it's completely free.
# call 'git lfs pull' after checkout
git lfs pull
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildAssetBundles.py
C:\skylicht-engine\Assets>cd ..
# Visual Studio 2019
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 16 2019" -A x64
# Visual Studio 2022
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64
# Xcode
/User/Skylicht/Documents/skylicht-engine$cmake -S . -B ./PrjMac -G Xcode
# Linux
$ skylicht-engine$ cmake -S . -B ./PrjLinux -G "Unix Makefiles"
Open the generated solution PrjVisualStudio/SKYLICHT_ENGINE.sln
Once the solution opens, right click the SampleXXX project, click "Set as StartUp Project" and click the play button at the top to run the Demo App.
More details: please preview command in BuildCommand folder.
# Install Tinydb
# https://pypi.org/project/tinydb
C:\skylicht-engine>C:\Python37\Scripts\pip install tinydb
# Install Pillow (Image processing)
# https://pillow.readthedocs.io/en/4.1.x/index.html
C:\skylicht-engine>C:\Python37\Scripts\pip install Pillow
# Compress TGA to DDS, ETC2 texture
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildTextureCompressDDS.py
C:\skylicht-engine\Assets>python BuildTextureCompressETC.py
C:\skylicht-engine\Assets>cd ..
# Install pcpp (C Preprocessor tool)
# https://pypi.org/project/pcpp
C:\skylicht-engine>C:\Python37\Scripts\pip install pcpp
# Build shader script
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildShader.py
C:\skylicht-engine\Assets>cd ..
// Assets\BuiltIn\Shader\Shadow\GLSL\LibShadow.glsl
#define HARD_SHADOW
// #define PCF_NOISE
And re-build the shaders
# Build shader script
C:\skylicht-engine>cd Assets
C:\skylicht-engine\Assets>python BuildShader.py
C:\skylicht-engine\Assets>cd ..
Projects/{ProjectName}/Source and regenerate projectC:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64
C:\skylicht-engine>python Scripts\create_project.py NewApplication Samples\NewApplication
# BuildAndroidNDK.cmd
# Set your pc folder, example
set MINGW=C:\MinGW\bin
set NDK=C:\Android\android-ndk-r26d
...
# Make folder jniLibs on Android Project
C:\skylicht-engine>mkdir Projects\Android\app\src\main\jniLibs
C:\skylicht-engine>mkdir Projects\Android\app\src\main\jniLibs\armeabi-v7a
C:\skylicht-engine>mkdir Projects\Android\app\src\main\jniLibs\arm64-v8a
# Copy result native ndk (from step 1) to jniLibs
# Project SampleSkinnedMesh
C:\skylicht-engine>copy Bin\Android\Libs\arm64-v8a\libSampleSkinnedMesh.so Projects\Android\app\src\main\jniLibs\arm64-v8a
C:\skylicht-engine>copy Bin\Android\Libs\armeabi-v7a\libSampleSkinnedMesh.so Projects\Android\app\src\main\jniLibs\armeabi-v7a
C:\skylicht-engine\Assets>python BuildTextureCompressETC.py
C:\skylicht-engine\Assets>python BuildAssetBundles.py
C:\skylicht-engine\Assets>cd..
Android APK:
C:\skylicht-engine>SET ASSET_PATH=Projects\Android\app\src\main\assets
Android AAB: Assets will be copied to assetPack: appdata
C:\skylicht-engine>SET ASSET_PATH=Projects\Android\appdata\src\main\assets
And copy command
# Copy built-in asset
C:\skylicht-engine>copy Bin\BuiltIn.zip %ASSET_PATH%
# Copy project asset
# Project SampleSkinnedMesh
C:\skylicht-engine>copy Bin\Common.zip %ASSET_PATH%
C:\skylicht-engine>copy Bin\SampleModelsResource.zip %ASSET_PATH%
# Dont forget copy ETC texture
C:\skylicht-engine>copy Bin\SampleModelsETC.zip %ASSET_PATH%
Open Android Studio and import project Projects\Android
Run command build from Android Studio:
# Grant permission executive for PVRTexTool
skylicht-engine/Tools/PVRTexTool/darwin$ chmod +x PVRTexToolCLI
# Build compress texture ETC
skylicht-engine/Assets$ python3 BuildTextureCompressETC.py
# Build asset bundles
skylicht-engine/Assets$ python3 BuildAssetBundles.py
If you want build samples for iOS device, you should replace the bundleIdentifier in Samples/{ProjectName}/CMakeLists.txt.
elseif (BUILD_IOS)
# replace your application name
set(MACOSX_BUNDLE_EXECUTABLE_NAME SampleHelloWorld)
set(APP_NAME "SampleHelloWorld")
# replace your bundleIdentifier
set(APP_BUNDLE_IDENTIFIER "com.skylicht.helloword")
set(CODE_SIGN_IDENTITY "iPhone Developer")
else()
And generate iOS xCode Project by this script.
# generate project for iOS device
skylicht-engine/BuildCommand$ ./GenerateXCodeIOS.sh
# or generate for iOS simulator
skylicht-engine/BuildCommand$ ./GenerateXCodeIOSSimulator.sh
Open iOS XCode Project on folder skylicht-engine/PrjIOS/SKYLICHT_ENGINE.xcodeproj
Note: iOS Simulator is not yet support compressed texture and hardware skinning.
Skylicht Engine can be compiled into a standalone library to simplify integration into other projects.
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64 -DINSTALL_LIBS=ON -DBUILD_SHARED_LIBS=ON
C:\skylicht-engine>cmake --build ./PrjVisualStudio --target install --config Debug
Note: Use the parameters "-DINSTALL_LIBS=ON -DBUILD_SHARED_LIBS=ON" with cmake command
C:\skylicht-engine>cmake -S . -B ./PrjVisualStudio -G "Visual Studio 17 2022" -A x64 -DINSTALL_LIBS=ON
C:\skylicht-engine>cmake --build ./PrjVisualStudio --target install --config Debug
And then copy the resulting InstallLibs folder to another project. See the project example: https://github.com/skylicht-lab/hello-skylicht See the API Reference
// INIT SCENE FUNCTION
// init scene/zone
CScene* scene = new CScene();
CZone* zone = scene->createZone();
// camera
CGameObject *camObj = zone->createEmptyObject();
CCamera* camera = camObj->addComponent<CCamera>();
camera->setPosition(core::vector3df(0.0f, 1.5f, 4.0f));
camera->lookAt(
core::vector3df(0.0f, 0.0f, 0.0f), // look at target position
core::vector3df(0.0f, 1.0f, 0.0f) // head up vector
);
// load model
CMeshManager* meshManager = CMeshManager::getInstance();
CEntityPrefab* meshPrefab = meshManager->loadModel("SampleModels/BlendShape/Cat.fbx", NULL, true);
// load material
CMaterialManager* materialMgr = CMaterialManager::getInstance();
// search textures folder
std::vector<std::string> textureFolders;
// use Skylicht Editor to edit .mat file
ArrayMaterial& catMaterials = materialMgr->loadMaterial("SampleModels/BlendShape/Cat.mat", true, textureFolders);
// create 3d object
CGameObject* cat = zone->createEmptyObject();
cat->setName("Cat");
cat->getTransformEuler()->setPosition(core::vector3df(0.0f, 1.0f, 0.0f));
// add render mesh component & init material
CRenderMesh* meshRenderer = cat->addComponent<CRenderMesh>();
meshRenderer->initFromPrefab(meshPrefab);
meshRenderer->initMaterial(catMaterials);
// update scene (1 frame)
scene->update();
// render scene to screen
CForwardRP* renderPipeline = new CForwardRP();
CBaseApp* app = getApplication();
u32 w = app->getWidth();
u32 h = app->getHeight();
renderPipeline->initRender(w, h);
// RENDER TO SCREEN FUNCTION
renderPipeline->render(
NULL, // render target is screen
camera, // the camera
scene->getEntityManager(), // all entities in scene
core::recti() // the viewport is fullscreen
);
Engine Components are used:
This demo is to draw Cube 3D, set up, transform and use components.

This demo code renders a 3D sphere, loads textures (Diffuse, Normal, Specular), and binds a SpecGloss shader to the material.

This demo code renders a Sci-fi Helmet, loads textures (Albedo, Roughness, Metal, AO, Emissive), and binds a Physically Based Rendering (PBR) shader to the material.

This demo code shows how to bind a shader to a material.

Engine Components are used:
This is an example of how to render a character model with animation. The models are downloaded from mixamo
This is a demo on how to use the UnwrapUV tool to create Lightmap UVs. Library xatlas is integrated to Skylicht Engine.
This is a demo showing how to use the lightmapper to bake indirect lighting colors onto a lightmap texture. Project references: Lightmapper
Result lightmap
Indirect lighting on Sponza baked by Skylicht Lightmapper.
This example is how to set up a simple lighting & lightmap. This scene uses basic diffuse bump specular shader.
Run on Ubuntu 20.04

This is a demo on how to use the lightmapper to apply indirect lighting color to vertex color.
Engine Components are used:
Irradiance baked on Vertex Color:
This is a demo to use CollisionManager to get collision point from the ray.

And how to query all triangles inside a Box

And how to use the decal projector feature

This is a demo on setting up the rendering of many mesh instances to optimize draw calls and rendering performance.
This is a demo of drawing many characters and animations using the GPU Instancing technique.

Skylicht Particle Component is a cleanup version of SPARK. We have optimized by GPU Billboard Instancing.
This is a demo showing how to create a particle system and use imgui
This is a demo code on how to use a simple projectile, impact, trail particle, sub emitter system.

This is demo code how to use noise library shader to make vfx effect, particle turbulence.
Welcome if you want to contribute your code to Skylicht Engine (Ex: add feature or fix bug). Wellcome to join the group. Open an issue and submit a pull request to this repository. Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.
Skylicht Engine is licensed under MIT License
Skylicht Engine is based in part on the work of:
This means that if you've used the Skylicht Engine in your product, you must acknowledge somewhere in your documentation that you've used. It would also be nice to mention that you use the 3rd parties library... Please see the README files from 3rd parties for further information.
Thanks, Project Maintainer: Pham Hong Duc
C++
67.4%
C
27.5%
HLSL
1.8%
GLSL
1.6%