본문 바로가기

일하면서 사용한 짧은 지식/C++, DirectX11

Direct2D Factory를 통해 생성한 리소스는 모두 같은 Factory에서 생성해야한다.

ID2D1Factory1*에서 생성하는 ID2D1Device*, ID2D1PathGeometry*, ID2D1TransformedGeometry* 모두 같은 ID2D1Factory1*에서 생성해야 문제가 없다.

 

 

 

https://www.codeproject.com/Articles/376597/Outline-Text-With-DirectWrite

 

Outline Text With DirectWrite

Draw text outline using DirectWrite

www.codeproject.com

 

위 예제와 같이 윤곽선이 있는 텍스트를 그리는 작업을 진행할 때 발생했던 문제.

 

처음 코드를 작성했을 때 ID2D1Factory1*를 멤버로 갖고 유지할 필요가 없을 것이라 생각했었다.

 

D2D1CreateFactory(...) 메서드를 이용해 ID2D1Factory1* 를 함수의 로컬변수에서 필요할 때만 생성하고 해제하면서 사용하였다.

 

1. 처음 문제가 발생한 곳은 ID2D1Factory1*와 이를 통해 생성한 ID2D1PathGeometry*를 이용해 ID2D1TransformedGeometry*를 생성할 때였다.

 

ID2D1Factory1*를 새롭게 생성해서 ID2D1PathGeometry* 생성한 팩토리가 아닌 다른 팩토리로 ID2D1TransformedGeometry*를 생성하면 생성되지 않았다.

 

그래도 이부분은 에러가 발생하여 동일한 팩토리를 사용해야 한다는 것을 빨리 찾을 수 있었다.

 

2. 하지만 오류는 발생하지않고 렌더 타깃에 텍스트가 그려지지 않는 문제가 발생.

 

ID2D1Factory1* 의 CreateDevice(...) 메서드를 이용해서 ID2D1Device*를 생성하고

ID2D1Device* 의 CreateDeviceContext(...) 메서드를 이용해 ID2D1DeviceContext*를 생성하였다.

 

ID2D1Factory1*에서 부터 연쇄적으로 디바이스, 디바이스 컨텍스트가 생성되는데 이 또한 동일한 팩토리를 통해 생성해야 리소스끼리 연결되어 텍스트를 그릴 수 있었다.

 

이렇게 되는 원인은 아래의 내용때문으로 추측된다.

 

https://docs.microsoft.com/en-us/windows/win32/api/d2d1/nn-d2d1-id2d1factory

 

ID2D1Factory (d2d1.h) - Win32 apps

Creates Direct2D resources.

docs.microsoft.com

 

ID2D1Factory 를 생성하려면 CreateFactory 메서드 중 하나를 사용 합니다. Direct2D 리소스를 사용하는 동안에는 ID2D1Factory 인스턴스를 유지해야 합니다.

 

 

https://docs.microsoft.com/en-us/windows/win32/Direct2D/resources-and-resource-domains

 

Resources Overview - Win32 apps

Describes Direct2D resources and how they can be shared.

docs.microsoft.com

 

Sharing Factory Resources


You can share all device-independent resources created by a factory with all other resources (device-independent or device-dependent) created by the same factory.