ID2D1Factory1*에서 생성하는 ID2D1Device*, ID2D1PathGeometry*, ID2D1TransformedGeometry* 모두 같은 ID2D1Factory1*에서 생성해야 문제가 없다.
https://www.codeproject.com/Articles/376597/Outline-Text-With-DirectWrite
위 예제와 같이 윤곽선이 있는 텍스트를 그리는 작업을 진행할 때 발생했던 문제.
처음 코드를 작성했을 때 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 를 생성하려면 CreateFactory 메서드 중 하나를 사용 합니다. Direct2D 리소스를 사용하는 동안에는 ID2D1Factory 인스턴스를 유지해야 합니다.
https://docs.microsoft.com/en-us/windows/win32/Direct2D/resources-and-resource-domains
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.