I'm learning 3D math and rendering fundamentals and I want to draw my own lines and rasterize my own triangles as part of what I'm currently doing. As it's software-based rendering, I can manually implement the algorithms with which I draw by accessing my own raw byte array which will form the basis of a bitmap to be painted onto the Direct2D surface. What is the best way to manually construct my own bitmap from raw bytes and translate that to something painted on Direct2D surface? Below is the code I'm using to initialize my setup, and it works just fine, if I let Direct2D do all the work of drawing lines and triangles and so forth. I'm having trouble finding a way to get my own data printed onto the surface though.
var swapChainDesc = new SwapChainDescription()
{
BufferCount = 2,
Usage = Usage.RenderTargetOutput,
OutputHandle = form.Handle,
IsWindowed = true,
ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm),
SampleDescription = new SampleDescription(1, 0),
Flags = SwapChainFlags.AllowModeSwitch,
SwapEffect = SwapEffect.Discard
};
Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport, swapChainDesc, out _device, out _swapChain);
_backBuffer = Surface.FromSwapChain(_swapChain, 0);
using(var factory = new FactoryD2D())
{
var dpi = factory.DesktopDpi;
_renderTarget = new RenderTarget(factory, _backBuffer, new RenderTargetProperties()
{
DpiX = dpi.Width,
DpiY = dpi.Height,
MinLevel = SharpDX.Direct2D1.FeatureLevel.Level_DEFAULT,
PixelFormat = new PixelFormat(Format.Unknown, AlphaMode.Ignore),
Type = RenderTargetType.Default,
Usage = RenderTargetUsage.None
});
}
I've tried constructing a DXGI Bitmap but I'm having trouble working out how to manipulate it. I've also tried calling Map() on the swapchain backbuffer in order to draw directly onto the backbuffer without having an intermediate bitmap, but I get an exception saying "the parameter is incorrect".