Записать пиксели на поверхность рендеринга d3d - PullRequest
0 голосов
/ 26 мая 2019

У меня есть приложение WPF с D3DImage в качестве основы для рендеринга чего-либо. D3DImage принимает IDirect3DSurface9. Я создал его с помощью SharpDX:

//Create d3d surface
_d3d = new Direct3D();
var windowHandle = new WindowInteropHelper(Window.GetWindow(this)).Handle;
var presentationParams = new PresentParameters(1, 1);
_d3dDevice = new Device(_d3d, 0, DeviceType.Hardware, windowHandle, CreateFlags.HardwareVertexProcessing, presentationParams);
_d3dSurface = Surface.CreateRenderTarget(_d3dDevice, size.Width, size.Height, Format.A8R8G8B8, MultisampleType.None, 0, true);

//Set it to image
_d3dImage = new D3DImage(96, 96);
_d3dImageRect = new Int32Rect(0, 0, size.Width, size.Height);
_d3dImage.Lock();
_d3dImage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, _d3dSurface.NativePointer);
_d3dImage.AddDirtyRect(_d3dImageRect);
_d3dImage.Unlock();

Это нормально работает, но наш движок рендерит холст с помощью SkiaSharp, который поддерживает только OpenGL. Мы рендерим что-то в SKSurface и хотим прочитать пиксели из SKSurface в d3dSurface.

var surface = SKSurface.Create(GrContext, false, info)
// draw something
var rect = _d3dSurface.LockRectangle(LockFlags.None);
surface.ReadPixels(rect.DataPointer);
_d3dSurface.UnlockRectangle();

Но это не работает, потому что мы не можем заблокировать поверхность RenderTarget. Итак, есть ли какой-нибудь рабочий способ отрисовки необработанных пикселей на поверхности d3d?

...