Собираюсь скрестить WPF и SlimDx Direct2D но мне нужно каким-то образом одержать SlimDx DXGI Surface из WPF D3DImage как сделал этот товарищ
http://www.gamedev.net/topic/573777-slimdx-direct2d-and-wpf/?
Всё остальное свободно валяется в сети, лишь не смог это найти.
Здравствуйте, Аноним, Вы писали:
А>Всё остальное свободно валяется в сети, лишь не смог это найти.
Прямо по ссылке намекнули на RenderTarget.FromDXGI
А вообще-то такие вещи лучше спрашивать у авторов —
вот тут (с их офсайта: "Please prefix your thread subject with [SlimDX] if the question is reasonably specific to SlimDX").
На всякий — примеры они выкладывают
здесь; для D2D ещё ничего полезного нет.
Здравствуйте, Sinix, Вы писали:
S>Прямо по ссылке намекнули на RenderTarget.FromDXGI
S>А вообще-то такие вещи лучше спрашивать у авторов — вот тут (с их офсайта: "Please prefix your thread subject with [SlimDX] if the question is reasonably specific to SlimDX").
S>На всякий — примеры они выкладывают здесь; для D2D ещё ничего полезного нет.
Дык оно то понятно что RenderTarget.FromDXGI, но где взять тот аргумент DXGI?
Здравствуйте, Аноним, Вы писали:
А>Дык оно то понятно что RenderTarget.FromDXGI, но где взять тот аргумент DXGI?
А не вспомню уже — я с SlimDX только игрался, на практике не пригодилось.
Код
вот отсюда даже похож на правду
Единственно, надо будет подсунуть другой surface.
Во всём вышесказанном разобраться не смог
. Но попытался методом тыка всё сделать.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Interop;
using System.Windows.Forms.Integration;
using SlimDX;
using D2D = SlimDX.Direct2D;
using D3D = SlimDX.Direct3D10;
using D3D1 = SlimDX.Direct3D10_1;
using DXGI = SlimDX.DXGI;
namespace SHHHHH
{
class SlimDxControl : ContentControl
{
static D2D.Factory g_D2DFactory;
static DXGI.Factory g_DXGIFactory;
static SlimDxControl()
{
g_D2DFactory = new D2D.Factory(D2D.FactoryType.SingleThreaded);
g_DXGIFactory = new DXGI.Factory();
}
D3D1.Device1 m_D3DDevice;
D2D.RenderTarget m_D2DRenderTarget;
public SlimDxControl()
{
Initialize();
}
void Initialize()
{
m_D3DDevice = new D3D1.Device1(g_DXGIFactory.GetAdapter(0), D3D.DriverType.Hardware, D3D.DeviceCreationFlags.SingleThreaded, D3D1.FeatureLevel.Level_10_0);
DXGI.SwapChainDescription schdesc = new DXGI.SwapChainDescription();
schdesc.IsWindowed = true;
schdesc.BufferCount = 1;
schdesc.SwapEffect = DXGI.SwapEffect.Discard;
schdesc.Usage = DXGI.Usage.RenderTargetOutput;
DXGI.ModeDescription mdesc = new DXGI.ModeDescription(200, 200, new Rational(1, 0), DXGI.Format.R8G8B8A8_SNorm);
mdesc.RefreshRate = new Rational(20,0);
mdesc.Scaling = DXGI.DisplayModeScaling.Centered;
mdesc.ScanlineOrdering = DXGI.DisplayModeScanlineOrdering.Progressive;
schdesc.ModeDescription = mdesc;
WindowsFormsHost wfhost = new WindowsFormsHost();
this.Content = wfhost;
wfhost.Child = new System.Windows.Forms.Panel();//Create panel because WindowsFormsHost.Handle is allways zero
g_DXGIFactory.SetWindowAssociation(wfhost.Child.Handle, DXGI.WindowAssociationFlags.None);
DXGI.SwapChain ch = new DXGI.SwapChain(g_DXGIFactory, m_D3DDevice, schdesc);
m_D2DRenderTarget = D2D.RenderTarget.FromDXGI(g_D2DFactory, DXGI.Surface.FromSwapChain(ch, 0), new D2D.RenderTargetProperties()
{
Type = SlimDX.Direct2D.RenderTargetType.Hardware
});
}
}
}
Но оно кидает exception на
DXGI.SwapChain ch = new DXGI.SwapChain(g_DXGIFactory, m_D3DDevice, schdesc);
Если здесь не ответят — пойду на рекомендованный в таких ситуациях форум
Извиняюсь за то что лезу не разбираясь в сути вопроса. Нужно просто прикрутить direct2d к WPF для быстрого рисования, а рисовать в direct2d — проще пареной репы.