wpf-skia-opengl
wpf-skia-opengl copied to clipboard
Proof of concept using Skia with WPF without WindowsFormsHost
WPF + Skia + OpenGL
A proof-of-concept of a GPU-accelerated surface without using WindowsFormsHost
Idea
Create a GL context manually, render all the compute-intensive stuff on an
off-screen surface, and draw the result on a WPF-compatible control (in this
case SKElement
).
Why
SkiaSharp's examples use a WindowsFormsHost control for GPU-accelerated rendering, which uses OpenTK.
There are however a few issues with WindowsFormsHost
:
- A window with
AllowsTransparency
enabled shows no controls - no transparency possible - Given we can't do
AllowsTransparency
, settingWindowStyle
toNone
still shows a border - Airspace problems - things like context menus or
DragMove
don't work over a forms host
How
Instead of using OpenTK, we're creating a GL context through native calls on
opengl32.dll
. This code has already been provided in SkiaSharp's test suite:
_glContext = new WglContext();
_glContext.MakeCurrent();
Then, we initialize an offscreen surface as usual:
_grContext = GRContext.Create(GRBackend.OpenGL);
_surface = SKSurface.Create(_grContext, true, new SKImageInfo(width, height));
After drawing on the surface's canvas, we draw the result back on
SKElement
' canvas:
canvas.DrawSurface(_surface, new SKPoint(0f, 0f));
The surface is disposed and recreated when the SKElement
's size changes.