Roman Kuznetsov, PhD
Experienced Software Engineer in C++ and Rendering.
![](/_next/static/media/pumpkin.1c469a72.png)
Career
![](/jobs/meta.png)
Meta
London, United Kingdom
Software Engineer
- Developing rendering technologies for Meta Reality Labs.
Mapbox
Minsk, Belarus
Senior Software Engineer
- Designed and developed rendering engine for Mapbox Vision SDK (OpenGL ES3, Metal);
- Developed rendering algorithms for AR, patented “Rendering Augmented Reality with Occlusion”;
- Developed
mapbox-gl-native
rendering engine for maps (3D terrain rendering and other features).
![](/jobs/vk.png)
VK (former Mail.Ru Group)
Moscow, Russia
Senior Software Engineer / Tech Lead
- Developed rendering engine (OpenGL ES2, OpenGL ES3, Metal, Vulkan) in C++ for MAPS.ME project, offline maps for iOS and Android;
- Was a tech lead in MAPS.ME product team, was responsible for rendering and core C++ libraries, set up technical direction for product in collaboration with iOS and Android tech leads;
- Implemented multiple systems for client-server communication (bookmarks cloud backup, real time analytics, travel guides synchronization);
- Profiled and optimized performance of MAPS.ME that was able to fully work on low-capable devices.
![](/jobs/alawar.jpeg)
Alawar
Novosibirsk, Russia
Senior Software Engineer / Technical Producer
- Developed internal tools in C++ and C# to support game publishing business of Alawar;
- Developed common game libraries for game studios publishing games in Alawar;
- Developed games for iOS and Android in internal studios of Alawar (Montezuma Blitz, Farm Frenzy and Friends, Epic Forces and others);
- Technically produced games of external and internal game studios working with Alawar (audit, code review, consultations).
Forward Development (former Multisoft)
Novosibirsk, Russia
Junior/Middle Software Engineer
- Improved, maintained and optimized rendering engine (based on Nebula 2 Engine);
- Implemented rendering algorithms (soft shadows, postprocessing, sky rendering, rain and snow rendering, realtime reflections and others);
- Integrated Direct3D 11 renderer and multi-screen rendering;
- Developed new world editor on C# and Ogre3D.
Projects
Skills
Programming Languages
![](/skills/cpp.webp)
C++
![](/skills/java.png)
Java
![](/skills/objc.png)
Objective-C
![](/skills/csharp.png)
C#
Swift
Python
![](/skills/ts.webp)
TypeScript
![](/skills/kotlin.png)
Kotlin
Graphics API
![](/skills/opengl.png)
OpenGL
![](/skills/metal.png)
Metal
![](/skills/directx.png)
DirectX
![](/skills/vulkan.png)
Vulkan
![](/skills/spirv.png)
SPIR-V
![](/skills/cuda.jpg)
CUDA
Engines
![](/skills/unity.png)
Unity
![](/skills/ogre.png)
Ogre3D
![](/skills/unreal.png)
Unreal Engine
Others
![](/skills/cmake.png)
CMake
![](/skills/react.png)
React
![](/skills/postgres.png)
PostgreSQL
![](/skills/mongodb.png)
MongoDB
![](/skills/opencv.png)
OpenCV
Academic
Doctor of Philosophy in Computer Science
Engineer in Computer Systems and Networks
Bachelor of Engineering in Computer Science
Algorithmic Toolbox Course
Assistant lecturer
Visiting professor
Publications
RENDERING AUGMENTED REALITY WITH OCCLUSION
AR elements are occluded in video image frames. A depth map is determined for an image frame of a video received from a video capture device. An AR graphical element for overlaying over the image frame is received. An element distance for AR graphical elements relative to a position of a user of the video capture device (e.g., the geographic position of the video capture device) is also received. Based on the depth map for the image frame, a pixel distance is determined for each pixel in the image frame. The pixel distances of the pixels in the image frame are compared to the element distance, and in response to a pixel distance for a given pixel being less than the element distance, the pixel of the image frame is displayed rather than a corresponding pixel of the AR graphical element.
Apple Metal in MAPS.ME
In the article, the integration of Apple Metal into the MAPS.ME project is described. The difference between Metal and OpenGL ES and their place in the MAPS.ME rendering engine
Drape
is considered. The results of frame rate and power consumption analysis for Metal in comparison with OpenGL ES are given.Traffic congestion rendering evolution in MAPS.ME
The traffic congestion visualization on the map is a complex engineering task including data collection, aggregation, compression and rendering. In the article, the rendering of the traffic congestion over the map in the MAPS.ME project is considered. The rendering technique is described, tradeoffs between frame rate and memory consumption are presented, the key metrics and results are given.
Navigation data rendering in MAPS.ME
In the article, the navigation data rendering over the map in the MAPS.ME project is considered. The rendering techniques for route, maneuvers directions, route clipping in OpenGL ES are presented.
Global Illumination in custom shaders in Unity 5
In the article, the Global Illumination integration into custom shaders in Unity 5 game engine is considered. At first, the process of creating a custom surface shader is given, a custom PBR shader using Cook-Torrance lighting model is introduced. Then integration with the Unity Global Illumination system is presented. In conclusion, rendering results are demonstrated.
Rendering engine architecture in MAPS.ME
In the article, the architecture of the rendering engine
Drape
in the MAPS.ME project is presented. The following features are covered: multi-context OpenGL ES rendering on Android and iOS; asynchronous geometry preparation; K-d tree application; SDF text rendering.Rendering in Apple Metal: Basics
In the article, the basics of rendering using Apple Metal are given. Initialization of an application, creation of
Metal Device
, interaction with Core Animation
framework, basic rendering API, synchronization and multi-threaded rendering are considered.Fur rendering using Shells and Fins algorithm
In the article, fur rendering using Shells and Fins algorithm is described. At first, the algorithm using geometry shaders is presented. Then the difference between DirectX 11 and OpenGL 4.3 implementations is considered. In conclusion the results of frame rate in DirectX 11 in comparison with OpenGL 4.3 are given.
Rendering shadows using Parallel-Split Shadow Mapping algorithm
In the article, Parallel-Split Shadow Mapping (PSSM) algorithm is described. At first, the basic shadow mapping approach is reviewed. Then PSSM is presented; the difference between DirectX 11 and OpenGL 4.3 implementations is considered. After that issues and limitations of the algorithm are discussed. In conclusion the results of frame rate in DirectX 11 in comparison with OpenGL 4.3 are given.
Order-Independent Transparency using linked lists in Direct3D 11 and OpenGL 4
In the article, Order-Independent Transparency using linked lists algorithm is described. At first, Order-Independent Transparency algorithms are reviewed. Then the linked lists approach is presented; the difference between DirectX 11 and OpenGL 4.3 implementations is considered. After that issues and limitations of the algorithm are discussed. In conclusion the results of frame rate in DirectX 11 in comparison with OpenGL 4.3 are given.
Facebook SDK for mobile free-to-play games on iOS
In the article, the integration of Facebook SDK to mobile free-to-play games on iOS is considered. The following technical details and the corresponding Objective-C code are presented: reaching out player’s friends from the game, posting to the timeline.
5 problems in development of mobile free-to-play games
In the article, 5 main problems in the development of mobile free-to-play games are considered. They are cross-platform work, package binary size, RAM usage, client-server interaction, performance. Some piece of advice and experience of Alawar is given.
Game Development in C++: theory and practice
In this lecture, game development in C++ is considered. Firstly, the architecture of a game is presented. Then the organization of C++ code, inheritance, polymorphism, templates, memory allocation, error handling and most useful design patterns are discussed. Some causes for the code overcomplication are given as well as practical recipes for avoiding it.