Danil 308d9b139e Update README.md | hai 2 meses | |
---|---|---|
example | hai 1 ano | |
glad-3.2-compat | %!s(int64=2) %!d(string=hai) anos | |
glew-cmake @ 7c2b7514f6 | %!s(int64=2) %!d(string=hai) anos | |
glfw @ 97da62a027 | %!s(int64=2) %!d(string=hai) anos | |
obsolete | %!s(int64=10) %!d(string=hai) anos | |
src | hai 1 ano | |
.gitignore | hai 1 ano | |
.gitmodules | %!s(int64=2) %!d(string=hai) anos | |
LICENSE.txt | %!s(int64=11) %!d(string=hai) anos | |
README.md | hai 2 meses |
Note about Vulkan - this nanovg_vulkan is Vulkan 1.0 project.\ Vulkan 1.3 already released with about 10 years back GPU support in drivers. Vulkan 1.3 have VK_KHR_dynamic_rendering in core.\ As minmal example of setup of complex pipeline look this blog - modern Vulkan with descriptor indexing, dynamic rendering and shader objects tutorial - and this repository vknew.\ I think rewriting this entire project from scratch in Vulkan 1.3 - will be faster and easier than fixin some bugs here and improving it.
Contact me in Discord or anywhere else if you want to ask some tech-info stuff, or I can add your "active" fork of this as link to this page.
added vulkan build, and cmake files, removed premake4.lua
Why I made this - I made it as a "test task for Vulkan related job" a year ago, for me this project has no real use. I would recommend for everyone use imgui if you look for production-ready Vulkan UI, also look on egui. I will not support or update this project at all, the last update was just to fix bugs and Validation errors.
Description - nanovg in C, no external dependencies. GLFW used only by one example (look examples description, there is example without using GLFW).
To launch - copy builded binary to example folder(or launch when this folder is current as on build example commands below). Because required fonts and images/shaders to load.
!=1
, Currectly - DPI scale set to 1 always. Read https://github.com/danilw/nanovg-vulkan-glfw-integration-demo/issues/1(use cmake to build on Windows, Windows/Linux supported and tested)
git clone --recursive https://github.com/danilw/nanovg_vulkan
cd nanovg_vulkan/example
mkdir build
cd build
cmake ../
make
cd ../
./build/example-vk
./build/example-vk_min_no_glfw
Look Examples description below there link to repository with C only minimal example without dependencies not using any library.
MoltenVK note - after TOPOLOGY_TRIANGLE_LIST
update(look below) this Vulkan port does work on MoltenVK(Mac/etc) but I dont have it to test so you should make cmake config to build it and launch by yourself.
Multiple frames in flight - example_vulkan.c is multiple frames in flight example, example_vulkan_min_no_glfw.c is single frame in flight. Clearly visible on FPS - with multiple frames about 3x better FPS.
example_vulkan.c - minimal NanoVG example that use GLFW.
example_vulkan_min_no_glfw.c - same as above but not using GLFW, supported Linux and Windows.
nanovg-vulkan-min-integration-demo - repository with minimal RenderPass integration example. Not using any libraries, no GLFW, only NanoVG code and C. Look description and screenshot on link.
nanovg-vulkan-glfw-integration-demo - repository with example from Vulkan-tutorial Depth buffering modified adding NanoVG integration. Using C++ and GLFW.
Remember NanoVG is not GUI, and examples about is just examples of this NanoVG integration, not GUI examples.
About RenderPass integration - copy paste code from integration examples above after your vkCmdEndRenderPass
(or before vkCmdBeginRenderPass
) and everything should work.
Framebuffer integration, where UI rendered in its own Framebuffer - I did not add example for this case, because it should be obvious - just replace framebuffer RenderPass with RenderPass of NanoVG integration examples above(look linked commit).
SubiyaCryolite pull request Optimizations > Cached Descriptor Sets, Implied Multiple Frames in Flight, Fencing for faster perf
vkResetDescriptorPool
per frame.example_vulkan
, using vkWaitForFences
to control rendering as opposed to vkQueueWaitIdle
(seems to be the biggest perf booster). This change also has implied "multiple frames in flight" as dictated by the swap-chain image count.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
instead of VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
, allows to skip calls to vkMap/UnmapMemory
per frameLink to version before this change 5ba9d31, this change 10d5211.
In this PR:
Merge latest nanovg
Fix Stencil Strokes:
I added a new enum to handle the 3 different pipelines used for stencil strokes.
I wanted to also use enums for the fill-path (nvgFill) to make the code cleaner, but haven't done that yet.
I combined the 2 CMakeLists.txt into example/CMakeLists.txt and added some bits to make it easier to build and debug in MSVC/VSCode.
I added GLAD as default gl-loader for the GL3 example. It can be switched back to GLEW (I kept glew to allow easier merge with main nanovg)
I Increased the number of swapchain images to minimum 3 and updated the swapchain barrier to gain some extra performance.
Spacebar renders the demo multiple times to add some 'load' when comparing performance
Thanks to @fzwoch commits by default used TOPOLOGY_TRIANGLE_LIST
, because TOPOLOGY_TRIANGLE_FAN
is optional in Vulkan.
To enable TOPOLOGY_TRIANGLE_FAN edit src/nanovg_vk.h
and set there #define USE_TOPOLOGY_TRIANGLE_FAN
Depth order bug on AMD fix by @leranger 6ee1009.
Screenshot of Vulkan version from Linux:
Read original readme for more info about NanoVG API https://github.com/memononen/nanovg