2020년 10월 23일 금요일

Direct X to WPF Control

1. HWND 사용

1
2
3
4
5
<Viewbox>
    <WindowsFormsHost Height="240" Width="500">
         <wf:PictureBox x:Name="GameDisplay"/>
    </WindowsFormsHost>
</Viewbox>
cs


1
2
3
4
unsafe
{
    _editor.Init(500500true, GameDisplay.Handle.ToPointer(), false01);
}
cs

 위처럼 WinForm 을 이용해서 Control 을 만들고, 그 컨트롤의 HWND 을 뽑아서 그걸 이용해 d3d device 를 만들면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void D3DImage::CreateSwapChain(unsigned int screenWidth, unsigned int screenHeight, HWND hwnd)
{
    DXGI_SWAP_CHAIN_DESC desc_swapChain;
    ZeroMemory(&desc_swapChain, sizeof(DXGI_SWAP_CHAIN_DESC));
    //count of back buffer
    desc_swapChain.BufferCount = 1;
    desc_swapChain.BufferDesc.Width = screenWidth;
    desc_swapChain.BufferDesc.Height = screenHeight;
    desc_swapChain.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    desc_swapChain.BufferDesc.RefreshRate.Numerator =  0;
    desc_swapChain.BufferDesc.RefreshRate.Denominator = 1;
    desc_swapChain.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    desc_swapChain.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
    desc_swapChain.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    desc_swapChain.SampleDesc.Count = 1;// off multi sampling
    desc_swapChain.SampleDesc.Quality = 0;
    desc_swapChain.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL;
    desc_swapChain.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
    desc_swapChain.Windowed = true;
    desc_swapChain.OutputWindow = hwnd;
 
    IDXGIDevice* device;
    Graphic::Get_Device()->QueryInterface(__uuidof(IDXGIDevice), (void**)&device);
 
    IDXGIAdapter* adapter;
    device->GetParent(__uuidof(IDXGIAdapter), (void**)&adapter);
 
    IDXGIFactory* factory;
    adapter->GetParent(__uuidof(IDXGIFactory), (void**)&factory);
 
    factory->CreateSwapChain(Graphic::Get_Device(), &desc_swapChain, &_swapChain);
}
cs

https://stackoverflow.com/questions/21292996/directx11-2-window-rendering

이 때 위처럼 하나의 device 를 이용해 여러개의 swapchain 을 만들어야한다.

다른 device 에서 생성한 d3dcomponent 는 서로 호환이 안됨.


2. D3D Image 사용

https://www.codeproject.com/Articles/28526/Introduction-to-D3DImage

https://github.com/Marlamin/SharpDX.WPF/blob/master/SharpDX.WPF/DXImageSource.cs

D3DImage 가 만들어져서, 이걸로 ImageBrush 를 만들고, 이게 Control 에 붙는게 WPF.

근데 direct9 만 지원해서, 따로 변환기를 써야함. 아래 깃이 그거.

그리고 SharpDX 버전이 2.6.2 만 지원이 되는데, 이거가지고 충돌나서 못써먹겠음.


3. DXGI 

https://docs.microsoft.com/ko-kr/windows/win32/direct3darticles/surface-sharing-between-windows-graphics-apis?redirectedfrom=MSDN

어려워보여서 아직 보류



댓글 없음:

댓글 쓰기

List