Library / SDK
amerkoleci/Vortice.Windows avatar
amerkoleci/Vortice.Windows

Vortice.Windows: managed bindings for the Direct3D 12, Direct3D 11 and Win32 stack

.NET bindings for Direct3D12, Direct3D11, WIC, Direct2D1, XInput, XAudio, X3DAudio, DXC, Direct3D9 and DirectInput.

1,247 stars92 forksCMIT

At a glance

What is it?
Vortice.Windows is a C# binding set for Direct3D12, Direct3D11, Direct3D9, WIC, Direct2D, XInput, XAudio2, X3DAudio, DXC and DirectInput, used by engines such as Evergine and Veldrid. It targets .net9.0 and .net10.0, and new feature work is gated behind sponsorship.
Who is it for?
Adopt Vortice.Windows if you are writing a Windows graphics or audio stack in C# and want direct access to the native Direct3D and Win32 APIs without writing your own P/Invoke layer, and you are prepared to depend on a project where feature requests require a sponsor.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 18 days ago.
What is it written in?
Mainly C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Vortice.Windows actually binds

Vortice.Windows is a collection of Win32 and UWP libraries carrying bindings for a wide slice of the Microsoft graphics and media stack. The README lists DXGI, WIC, DirectWrite, Direct2D, Direct3D9, Direct3D11, Direct3D12, XInput, XAudio2, X3DAudio, DirectInput, DirectStorage, DirectML, UIAnimation and DirectSound. The repository description adds DXC to that set, which matters because shader compilation is where a graphics binding either gives you a usable pipeline or leaves you to shell out to a separate tool.

The point of the project is to remove the P/Invoke and COM plumbing. A developer working in C# who wants to submit a Direct3D 12 command list would otherwise write the interop by hand, or adopt a framework that decides the abstraction on their behalf. Vortice.Windows is the middle path: the native API shape is preserved, including the awkward parts, and the binding is generated rather than transcribed.

That generation is visible in the credits section, which says SharpDX bindings were used for some platforms to understand how mapping works using SharpGenTools. The same SharpGen tooling appears in the build instructions, where the note about no spaces in the solution path is a direct consequence of how the generator is invoked. So the mechanism is code generation from the platform metadata, with the resulting interop compiled into the library.

The package names follow a Vortice prefix, for example Vortice.Direct3D12, and each is published to NuGet. The tree has a src/ directory holding the individual binding projects, a tests/ directory, a samples/ directory with working examples, and build files at the root including Directory.Build.props, Directory.Packages.props, global.json and Vortice.Windows.slnx.

The scope of the tree: one directory per API, samples per API

The samples directory is the fastest way to understand the shape of the library, because it contains a small project per technology: HelloDirect3D11, HelloDirect3D12, HelloDirect3D12Raytracing, HelloDirectInput, HelloDirectML, HelloDirectStorage, HelloXAudio2, HelloWinForms, XInput, MediaFoundation, AdvancedTextRenderingApp and Vortice.SampleFramework. Each is a runnable starting point rather than a fragment.

Two of them stand out for what they imply. HelloDirect3D12Raytracing tells you the Direct3D 12 binding covers the raytracing extension rather than only the core graphics pipeline. HelloDirectML covers the DirectML machine learning API, which the credits attribute to Aaron Sun. MediaFoundation and AdvancedTextRenderingApp cover the media and text stacks, and the latter pairs with the DirectWrite and Direct2D bindings in the README's list.

Vortice.SampleFramework is the shared harness these samples build on, and its presence in the same directory tells you the samples are meant to be read together as a set of working references. Beyond the in-repository samples, the README points at a separate Vortice.Windows.Samples repository, a WinUI3 tutorial series by Juhakeranen, Direct3D 12 DXR samples by CAMongrel, NVIDIA's raytracing samples ported to C# by Jorgemagic, and an ImGui example by YaakovDavis.

The third-party example list is a useful signal for the ecosystem position. Evergine, a commercial engine, Veldrid, MiniEngine and SharpAudio are listed as projects using Vortice.Windows. The fact that an established graphics library such as Veldrid builds on it says the bindings are treated as a stable enough base for a real renderer rather than as a toy.

Setting up the build: Visual Studio 2022, the Windows 11 SDK, and a path without spaces

The build requirements are spelled out because the toolchain is not the default one. You need Visual Studio 2022 with the Visual C++ Toolset Component, the Windows 11 SDK (10.0.26100.0) and the .NET 10 SDK installed.

The path requirement is the part that trips people up. The README states that in order to compile you must make sure no spaces are present in the solution path, otherwise SharpGen will fail to generate bindings. That is not a style preference but a hard requirement of the code generation step, and it applies to wherever you clone the repository, not just to the project directory inside it.

For consuming the library rather than building it, the packages are on NuGet under the Vortice prefix, and the repository ships a NuGet.config at the root, along with a Vortice.snk strong name key file, which is how the assemblies are signed. A related package, Vortice.D3D12MemoryAllocator, provides D3D12MemoryAllocator bindings built on Vortice.Direct3D12 resources, with native libraries for Windows x64 and ARM64.

One caveat on version numbers before you plan an upgrade. The README says the library targets .net9.0 and .net10.0 and uses modern C#, and points to a CHANGELOG file for the list of changes between commits. The most recent tagged releases in the repository's release list, v1.9.143, v1.9.130 and v1.9.117, were all published in 2021. The repository itself is not archived and the last push was on 2026-10-05, so work continues on the main branch, but the published release tags are old and the CHANGELOG is where the current state of the API is described.

Where the low-level work actually lives

The README includes a redirect that matters for anyone shopping for a binding set: if you are looking for high-performance low level bindings, it points to Vortice.Win32, a separate repository. Vortice.Windows is the one for the higher-level graphics, media and input APIs.

That division of labour is the main architectural fact about the project. Splitting the raw Win32 surface away from Direct3D, Direct2D, XAudio and the rest keeps each package's dependency footprint smaller, which matters when you are binding into a game engine where the size and the load time of managed assemblies both count.

There is also a naming wrinkle worth verifying before you pin a version. The README badge for the NuGet package links to a search on nuget.org for packages tagged Vortice.Windows and Direct3D12, and the D3D12MemoryAllocator package README is referenced at a path under src/. Older references to this project may use the SharpDX-style naming, and the credits section explicitly mentions SharpDX, so the API and package names have moved over time. The CHANGELOG in the repository is the place to check what a given version calls things.

What the README does not document is a support policy, a compatibility matrix between the binding version and a particular Direct3D 12 SDK build, or a statement about which platform versions are supported. Those details have to be established by reading the CHANGELOG and by testing against the Direct3D 12 runtime you actually ship against.

The sponsorship gate and what it means for your roadmap

There is a line in the README that changes how you should plan around this dependency. The note says any feature request would require a sponsor in order to allow faster implementation and allow this project to continue. The sponsors section asks for a sponsor to further help development and to allow faster issue triaging and new features to be implemented.

Read plainly, that means the work queue is ordered by who is paying, not by community vote or by a stated roadmap. This is not a criticism of the arrangement, and it is a common and workable model for low-level interop work where each new API surface is expensive to get right. It is a planning input. If your product needs a specific Direct3D 12 feature that is not yet bound, your schedule depends on a sponsorship conversation, not on a public backlog.

The same note carries a different, sharper risk. A binding set that is generated against a specific Windows SDK and a specific Direct3D 12 version has a natural upgrade cadence tied to the Windows SDK, and the README pins the build to the Windows 11 SDK (10.0.26100.0). When Microsoft updates the platform, the bindings need regeneration, and a project that gates new work on sponsors will handle that at its own pace.

The counter-argument is that the bindings are generated, so the work is mechanical rather than creative, and the package exists precisely to absorb that mechanical layer. Whether that constitutes a risk depends on how much of your rendering stack sits directly on these types. A renderer built on them inherits the dependency more deeply than an application that uses the bindings at the edges.

Where Vortice.Windows sits against engine-level alternatives

The alternative approach is not another binding set but a different level of abstraction, and the project itself points at both directions.

Inside the Vortice family there is a documented split. The README says that if you are looking for high-performance low level bindings, you should visit Vortice.Win32, a separate repository. Vortice.Win32 covers the raw Win32 surface, while Vortice.Windows carries DXGI, WIC, DirectWrite, Direct2D, Direct3D9, Direct3D11, Direct3D12, XInput, XAudio2, X3DAudio, DirectInput, DirectStorage, DirectML, UIAnimation and DirectSound. Choosing between them is a question of which layer of the platform your code is allowed to talk to.

Above both sits the engine level, and the README names real examples on both sides of the divide. Evergine and Veldrid are listed among the projects that use Vortice.Windows, alongside MiniEngine and SharpAudio. Evergine is a commercial engine and Veldrid is a graphics library, so both sit above the binding layer rather than replace it: they use the bindings, then add their own renderer and resource model on top. The README does not describe the internals of either, so what can be said from the documentation is limited to that relationship.

The difference in approach is directness of access. With Vortice.Windows you hold the native objects and call the native API, so you inherit its full expressiveness and its full complexity, including the parts that Microsoft documents sparsely. With an engine you work inside an API that someone has already made decisions about, and you trade expressiveness for a surface you can hold in your head.

There is a middle option in the same ecosystem. The Vortice project is split so that the low-level Win32 bindings live in Vortice.Win32 while Vortice.Windows carries the graphics and media APIs. If your need is thin, for example calling a couple of XInput functions or loading a texture through WIC, taking only the specific packages you need keeps the dependency surface small, and the README says each top-level package is referenced individually through NuGet.

Editorial conclusion

Adopt Vortice.Windows if you are writing a Windows graphics or audio stack in C# and want direct access to the native Direct3D and Win32 APIs without writing your own P/Invoke layer, and you are prepared to depend on a project where feature requests require a sponsor. Do not adopt it if you need cross-platform support, a hand-written abstraction over graphics, or a binding set with a stable public API contract, since the naming of the repositories has changed and version bumps are described in a changelog rather than pinned. Verify first that your Visual Studio 2022 installation includes the Windows 11 SDK and the .NET 10 SDK, that the path to your checkout contains no spaces, and that the CHANGELOG in the repository covers the Direct3D version you need.

Frequently asked questions

Which .NET versions does Vortice.Windows target?

The README states that the library targets .net9.0 and .net10.0 and uses modern C#. Building from source additionally requires Visual Studio 2022 with the Visual C++ Toolset, the Windows 11 SDK (10.0.26100.0) and the .NET 10 SDK.

Why does building Vortice.Windows fail when the path contains spaces?

The build instructions say that no spaces may be present in the solution path, otherwise SharpGen will fail to generate bindings. The bindings are generated by that tool, so the constraint comes from the generation step rather than from the C# compiler.

How are new features added to Vortice.Windows?

The README states that any feature request would require a sponsor in order to allow faster implementation, and the sponsors section asks for sponsorship to help development and issue triaging. The most recent published release tags in the repository date from 2021, while the repository itself is not archived and the last push was on 2026-10-05.

Which Direct3D 12 features does the Vortice.Windows binding cover?

The samples directory includes HelloDirect3D12 and HelloDirect3D12Raytracing, so the binding reaches the raytracing extension as well as the core pipeline. The repository also ships a separate Vortice.D3D12MemoryAllocator package providing D3D12MemoryAllocator bindings on top of Vortice.Direct3D12 resources.

Official sources

  1. amerkoleci/Vortice.Windows on GitHub
  2. Issues
  3. License: MIT
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/amerkoleci-vortice-windows.svg)](https://hysenlabs.com/projects/amerkoleci-vortice-windows)

Was this useful?