2010-12-19 8 views
1

를 만들 수 없습니다 :내가이 메서드를 호출하고있어 Direct2D의 DXGI 표면

http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx

호출은 E_NOINTERFACE와 함께 실패합니다. 특히 이것이 일어날 수있는 이유에 대한 문서는 도움이되지 않습니다. 모든 DirectX 11 디버깅 기능을 사용할 수있게되었습니다. 나는 유효한 IDXGISurface1* (또한 시도한 IDXGISurface)이 있고 다른 매개 변수가 올바르게 설정되어 있음을 알고 있습니다. 이 호출이 실패하는 이유에 대한 아이디어가 있습니까?

편집 :

또한 D3D11 장치를 만드는 데 문제가 있습니다. nullptr을 D3D11CreateDeviceAndSwapChain의 IDXGIAdapter * 인수로 전달하면 올바르게 작동하지만 어댑터를 직접 열거하고 포인터 (전달 된 유일한 값)를 전달하면 잘못된 인수로 실패합니다. MSDN 문서에서는 nullptr이 전달되면 EnumAdapters1의 첫 번째 반환 값을 사용한다고 명시 적으로 말합니다. DX11 시스템을 실행 중입니다.

답변

2

Direct2D는 D3D11 장치가 아닌 D3D10 장치를 사용합니다. D3D11 장치가 아마도 그 E_NOINTERFACE에 의한 인터페이스가 부족한 것으로보고됩니다.

+0

http://msdn.microsoft.com/en-us/library/ee913554 (VS.85) .aspx는 DX11을 포함한 모든 DXGI1.1 기술이 표면을 공유 할 수 있다고 말합니다. – Puppy

+0

당신이 설명하는 것과 같은 문제가 있습니다. http://www.gamedev.net/community/forums/topic.asp?topic_id=547920 –

+0

Goddamnit을 참조하십시오. 따라서 D3D11 인터페이스는 자체 텍스트를 렌더링 할 수 없으며 D2D와 상호 작용할 수 없습니다. 그저 훌륭합니다. – Puppy

6

Direct2D는 Direct3D 10.1 장치를 만들 때만 작동하지만 과 Direct3D 11로 서페이스를 공유 할 수 있습니다. 두 장치를 모두 만들고 모든 Direct2D 콘텐츠를 공유하는 모든 작업을 수행해야합니다 . 내 자신의 응용 프로그램에서이 기술을 사용하여 Direct3D 11에서 Direct2D를 사용합니다. 약간의 비용이 들지만 프레임 당 작고 일정합니다.

사용해야하는 과정의 기본 개요는 다음과 같습니다 평소처럼

  1. 이 Direct3D를 (11) 장치를 만듭니다.
  2. ID3D11KeyedMutex 인터페이스에 액세스 할 수 있도록 (듯이), D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX 옵션을 사용해 텍스처를 생성한다.
  3. GetSharedHandle을 사용하면 장치간에 공유 할 수있는 텍스처의 핸들을 가져올 수 있습니다.
  4. Direct3D 10.1 장치를 만들어 동일한 어댑터에 만들어야합니다.
  5. OpenSharedResource 함수를 Direct3D 10.1 장치에서 사용하여 Direct3D 10.1의 텍스처 버전을 가져옵니다.
  6. 텍스처의 D3D10 KeyedMutex 인터페이스에 액세스 할 수 있습니다.
  7. Direct3D 10.1 버전의 텍스처를 사용하여 Direct2D를 사용하여 RenderTarget을 생성하십시오.
  8. D2D로 렌더링하려면 키가있는 뮤텍스를 사용하여 D3D10 장치의 텍스처를 잠급니다. 그런 다음, D3D11에서 이것을 획득하고 아마도 이미하려고했던 것처럼 텍스처를 렌더링하십시오.

이것은 사소한 것이 아니지만 잘 작동하며 상호간에 상호 운용하도록 의도 한 방식입니다. Windows 8은 완전한 D3D11 호환성을 도입 한 것처럼 보이므로 원하는만큼 간단하게 처리 할 수 ​​있습니다.

+1

잘 작동합니다! OpenSharedResource1()을 사용해야했습니다.또한 AcquireSync()를 부적절하게 사용할 때 공유 텍스처가 검은 색이었습니다. 따라서 적절한 매개 변수를 사용하여 AcquireSync()/ReleaseSync()를 사용하는 것이 매우 중요합니다. 그렇지 않으면 텍스처의 내용이 검은 색이라고 생각할 수 있습니다. –