Open Source 3D Engine

Unleash your creativity with Kemena3D, an open-source, cross-platform 3D engine built for game developers, artists and engineers alike. Featuring a powerful runtime library and an intuitive editor, Kemena3D is designed to bring immersive worlds to life, from prototyping to production.

Currently in active development.

Work-in-progress screenshots

Here are some work-in-progress screenshots highlighting the potential of the game engine.

About Kemena3D

Kemena3D was born from frustration with licensing controversies and the complexity of bloated game engines that hinder indie developers from building their dream games. Its core philosophy is to strike a balance between ease of use and robust functionality.

Hello World in C++

We recognize that not everyone is making a game, or doing it the way we do. You might be working on a simple project with minimal development needs, and that’s completely fine. Kemena3D gives you the freedom to access its barebones C++ core, empowering you to build whatever you envision.

The editor is entirely optional, designed for those who prefer a more convenient, streamlined workflow. Beyond games, Kemena3D is also suited for non-game applications like engineering simulations, scientific visualizations, interactive media and more.

Here’s the simplest Hello World example. We’ve aimed to keep it as clean and straightforward as possible. Please note that the code may evolve as development progresses.
				
					#include "kemena.h"

using namespace kemena;

int main()
{
    // Create window and renderer
    kWindow* window = createWindow(1024, 768, "Kemena3D Demo");
    kRenderer* renderer = createRenderer(window);
    renderer->setClearColor(vec4(0.4f, 0.6f, 0.8f, 1.0f));
    
    // Create the asset manager, world and scene
    kAssetManager* assetManager = createAssetManager();
    kWorld* world = createWorld(assetManager);
    kScene* scene = world->createScene("My Scene");
    
    // Create a camera and a sun light
    kCamera* camera = scene->addCamera(vec3(-20.0f, 5.0f, 20.0f), vec3(0.0f, 0.5f, 0.0f));
    kLight* light_sun = scene->addSunLight(vec3(2.0f, 5.0f, 0.0f), vec3(0.2f, -1.0f, 0.0f), vec3(0.1f, 0.1f, 0.1f), vec3(1.0f, 1.0f, 1.0f));
    
    // Create a shader and a material
    kShader* shader = assetManager->createShader("path/mesh.vert", "path/mesh_phong.frag");
    kMaterial* material = assetManager->createMaterial(shader);
    
    // Apply textures to the material
    kTexture2D* tex_albedo = assetManager->loadTexture2D("path/albedo.png", "albedoMap", TextureFormat::TEX_FORMAT_SRGBA);
    kTexture2D* tex_normal = assetManager->loadTexture2D("path/normal.png", "normalMap", TextureFormat::TEX_FORMAT_RGBA);
    kTexture2D* tex_spec = assetManager->loadTexture2D("path/specular.png", "specularMap", TextureFormat::TEX_FORMAT_RGBA);

    material->addTexture2D(tex_albedo);
    material->addTexture2D(tex_normal);
    material->addTexture2D(tex_spec);
    
    // Load a 3D model and apply the material to it
    kMesh* mesh = scene->addMesh("path/model.fbx");
    mesh->setMaterial(material);
    
    // Game loop
    while (window->getRunning())
    {
        if (eventTriggered(K_EVENT_QUIT))
        {
            window->setRunning(false);
        }
        
        renderer->clear();
        renderer->render(scene, 0, 0, window->getWindowWidth(), window->getWindowHeight(), window->getTimer()->getDeltaTime());
        window->swap();
    }

    // Clean up
    renderer->destroy();
    window->destroy();
    return 0;
}
				
			

© 2025 Lee Zhi Eng & Kloena Digital. All rights reserved