Category Archives: Graphics

Building PowerVR Vulkan Samples

I did

git clone
cd Native_SDK
git submodule update --init --recursive

opened build-android folder in Android Studio and started the build.

Building QT6.4 for Windows with Vulkan support

Installed Vulkan SDK and built QT6.4.2 for windows with the following script:


"C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvarsall.bat" amd64


mkdir \dev\build\qt
cd \dev\build\qt
set "CMAKE_ROOT=%MY_DRIVE%\dev\tools\cmake-3.24.2-windows-x86_64\bin"
set "NINJA_ROOT=%MY_DRIVE%\dev\tools\ninja-win"
set "PERL_ROOT=%MY_DRIVE%\dev\tools\Strawberry\perl\bin"
set "PYTHON_ROOT=%MY_DRIVE%\dev\tools\Python35"
set VULKAN_SDK=%MY_DRIVE%/dev/tools/VulkanSDK/

Investigating SDFile in RenderDoc

When we click on a node in Event Viewer: see renderdoc\qrenderdoc\Windows\APIInspector.cpp:

void APIInspector::OnSelectedEventChanged(uint32_t eventId)
  ui->apiEvents->saveExpansion(ui->apiEvents->getInternalExpansion(m_EventID), 0);



  m_EventID = eventId;
  ui->apiEvents->applyExpansion(ui->apiEvents->getInternalExpansion(m_EventID), 0);

How RenderDoc works with Vulkan app

Launching a Windows app

I built Vulkan samples for Windows as follows:

set MY_VS_GENERATOR="Visual Studio 17 2022"
cd \dev\build\v
set MY_CMAKE_EXE=%MY_DRIVE%\dev\tools\cmake-3.24.2-windows-x86_64\bin\cmake.exe
%MY_CMAKE_EXE% ..\..\repos\Vulkan -G %MY_VS_GENERATOR% -A x64
rem Open generated vulkanExamples.sln and build.

and launched bloom.exe with RenderDoc:


How RenderDoc works with OpenGL app

I cloned RenderDoc’s repository:

git clone

easily built renderdoc\renderdoc.sln with MSVC2022 on my home machine, opened my Lines Game built on Windows with OpenGL:


Building Vulkan samples for Android

Cloned the repository:

git clone
git submodule init
git submodule update

Updated assets:


Installing Vulkan SDK on Windows

I downloaded Vulkan SDK and installed Vulkan Hardware Capability Viewer at C:\VulkanSDK\\Bin\vulkanCapsViewer.exe:


Using “apitrace” with an OpenGL application

The basic commands for using apitrace with an OpenGL application are:

apitrace trace --api=gl MyApp
qapitrace MyApp.trace
apitrace dump --blobs MyApp.trace 

The last command generates blobs that can be inspected with the following command, for example:

tail -c $((12*10)) ~/repos/MyApp/build/blob_call2325.bin | xxd -g1

Or by writing a simple C++ program that converts them into CVS format:


How I learned OpenGL

To learn OpenGL I wrote a simple game that utilizes the most of basic OpenGL ES 2.0 (and partially 3.0) techniques:

  • MVP matrix. In 3D version of the game the projection matrix is calculated depending on the window size (viewport).
  • All the objects including the board, balls, path arrows, sparkles, explosion particles sit in vertex buffers and are rendered with vertex/fragment shaders.
  • The light is implemented with common fragment shader calculating ambient, specular and diffuse coefficients. The sparkle position is found by iterating over the normals and searching the maximum light coefficient.
  • The antialiasing is achieved by rendering the scene first to 4 times bigger offscreen buffer and then rendering the buffer to the screen with multisampling.
  • Color coding is used to determine what object the user has clicked on. The board and the balls are rendered first with alpha containing the object identifier (that is why the board size is limited with 15×15), then alpha is erased and the background is rendered over it with a specific blending operation.
  • Textures are used for rendering the background images, sparkles and particles.
  • All the rendering is done on a separate thread and the swaps (flips) are synchronized with the monitor refresh cycles. This prevents screen tearing and saves the battery power.

Drawing a transparent image with OpenGL ES in a UWP XAML app

In my previous post Testing XAML App for OpenGL ES on Windows 10 Mobile Device I described the changes I made to UWP application based on “XAML App for OpenGL ES (Universal Windows)” template to demonstrate some strange effect related to the transparency of the image drawn with OpenGL ES in SwapChainPanel. But I did yet another experiment with this application and got some beautiful pictures that demonstrate what happens if I make the scene completely transparent with the following code:

void SimpleRenderer::Draw()
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);