일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c++
- Visual Studio
- Programming
- 문법
- 연산자
- 백준
- Tips프로그래밍강좌
- Desktop
- 알고리즘
- 이지스퍼블리싱
- 프로그래밍
- 리뷰
- c#
- c
- 티스토리
- 포인터
- 김성엽
- 함수
- Tips강좌
- CS
- Javascript
- doit코틀린프로그래밍
- Windows
- 배열
- Kotlin
- VS ERROR
- 지식나눔강좌
- Direct2D
- tipssoft
- Win32
- Yesterday
- Today
- Total
목록Direct2D (30)
F.R.I.D.A.Y.
게임이란 현대 기술의 정점을 모두 포함하고 있는 기술의 정수다 문득 이런 구절이 떠오르는 포스트가 아닐까 생각합니다. 누가 말했는지는 몰라도 정말 한번에 와 닿는 말이 아닐 수 없습니다. RPG에서만 보더라도 다양한 물리 법칙이 적용된 엔진[# 유니티와 언리얼이 대표적이죠]이 사용되고, FPS 게임에서는 심지어 탄도학도 이용[# 단순히 배틀그라운드 탄도학만 검색해도 나오는 글이 수 십 개...]합니다. 게임에서 중요한 것 중 하나가 막혀 있는 곳을 가지 못하는 것이라 생각합니다. 생각해보세요. 현실에서 물건을 짚으려 손을 뻗었는데 짚이기는 커녕 그 물건을 통과해버린다면. 아마도 기절하지 않을까요? 그래서 게임에서는 물리 엔진을 사용합니다. 사실 게임에만 사용한다기보단, 여러 산업 전반에서 사용하고 있죠...
Direct2D에서 그래픽 변형을 가할 수 있는 SetTransform 메서드 그래픽 변형 그래픽 변형이라 함은 아래의 것들이 있습니다. 크기 조절 회전 반전 이동 이러한 항목들은 WIC 컴포넌트에서도 구현할 수 있지만, 그 속도가 느립니다. 만일 그리기 위한 그래픽 변형을 한다면 Direct2D에서 제공하는 SetTransform 메서드를 이용하는 것이 좋습니다. SetTransform SetTransform 메서드는 그래픽 변형을 가하는 메서드로서, 두 개의 오버로드가 존재합니다. 여기에서는 레퍼런스 참조를 통한 메서드를 기본으로 합니다.[# 레퍼런스 참조를 하는 메서드는 아마도 어드레스 참조를 하는 메서드를 이용해 구현했겠죠.] 메서드 원형 void SetTransform( const D2D1_MA..
이미지를 회전하거나 반전시킬 수 있는 IWICBitmapFlipRotator IWICBitmapFlipRotator 이미지를 회전하거나 반전시킬 수 있는 인터페이스입니다. 단점 먼저 구현 및 시연을 하기 전에 단점을 들자면, 기준에 맞추어 원하는 각도로 변형은 불가능합니다. 애초에 WIC가 Windows Imaging Component의 약자로, 불러오기 및 저장하기가 주된 목적이기 때문입니다. 따라서 만일 90°의 배수로 이미지를 회전시키는 경우가 아니라면 IWICBitmapFlipRotator 객체는 사용할 수 없습니다. 이미지 반전의 경우 상하, 좌우 변형만 가능합니다. 구현 IWICBitmapFlipRotator의 구현은 IWICImagingFactory에서 할 수 있습니다. IWICImaging..
대상 비트맵을 일정 영역 잘라내는 IWICBitmapClipper IWICBitmapClipper 가끔 이미지 작업을 하면 이미지의 일부를 잘라내야하는 작업이 필요합니다. 단적인 예로, 게임에서 움직이는 대상의 움직임을 하나의 이미지 파일로 생성하고, 움직이는 모션을 보일 때는 그 이미지를 필요한 모션을 찾아 잘라 사용하는 방식도 있습니다. 웹에서는 여러 아이콘 파일을 하나의 이미지로 생성하고 필요한 위치에 이미지를 잘라서 로드하는 방식을 이용합니다. 구현 IWICBitmapClipper의 구현은 IWICImagingFactory 객체에서 구현할 수 있습니다. IWICImagingFactory* pWicFactory; IWICBitmapClipper* pClipper; // IWICImagingFacto..
비트맵의 포맷을 변경하는 IWICFormatConverter IWICFormatConverter 비트맵은 꽤 다양한 형식을 가지고 있습니다. 애초에 형식이라는게 비트맵 생성자가 비트맵 형식을 설명해주는 것으로 어떻게 만들던 상관은 없죠.[# 뭐 성능 좋은 형식이라면 금상첨화지만] 그러나 사용자가 요구하는 비트맵 형식이 있기도 합니다. Direct2D가 그 예입니다. Direct2D - WIC를 이용해 이미지 그리기 WIC는 Windows Imaging Component라는 이름을 가진 코덱 프레임워크이다. # 해당 내용은 Direct2D의 기본 구조를 알고 있어야 진행이 원활합니다. # 해당 내용은 다음 포스트를 기반에 두고 있습니다. WIC pang2h.tistory.com 여기에서 잠깐 소개 했지만,..
비트맵 크기를 조절할 수 있는 IWICBitmapScaler IWICBitmapScaler IBitmapSource를 기반으로 구현된 인터페이스로, 대상의 크기를 조절할 때 사용합니다. 사용해야하는 이유 모든 이미지가 출력할 크기와 맞다면 모르겠지만, 많은 경우가 출력할 크기와 실제 파일의 width, height 크기가 다릅니다. 만일 원본에 크기 변형을 가하지 않은 상태로 그리게되면, 상당히 깨진 모습을 볼 수 있습니다. 다음은, 휴대폰에서 낼 수 있는 최대 화소인 1억 800만 카메라로 촬영한 이미지를 윈도우 전체에 출력한 모습입니다. 우측의 이미지는 Windows10에 내장된 사진 앱으로 파일을 열었을 때입니다. 사진 앱으로 열었을 때는 부드럽게 표현되는 이미지가 프로그램에서 열었을 때는 일부 깨..
WIC는 Windows Imaging Component라는 이름을 가진 코덱 프레임워크이다. # 해당 내용은 Direct2D의 기본 구조를 알고 있어야 진행이 원활합니다. # 해당 내용은 다음 포스트를 기반에 두고 있습니다. WIC WIC는 COM[# Component Object Model] 객체로서, 이를 이용하려면 사용하려는 프로그램[# 정확히는 프로세스]에서 COM 객체의 메서드와 같은 요소에 접근하는 것을 허용하도록 해야합니다. 애플리케이션의 시작에서 CoInitialize 함수를 호출합니다. 코드에서는 WinMain의 코드가 되겠네요. HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); if (!win.Create(L"Win32 W..
Direct2D에서 텍스트 출력을 시행하기 전, 필요한 리소스를 생성할 수 있는 인터페이스 IDWriteFactory IUnknown 인터페이스로부터 상속받았기 때문에, 종종 IUnknown 으로 캐스팅해 넘길 때가 있습니다. CreateTextFormat 텍스트 레이아웃을 위한 객체를 생성합니다. 여기에서 텍스트 레이아웃이란 텍스트를 그릴 영역의 크기를 의미합니다. 만일 이 레이아웃의 크기보다 그리게 되는 텍스트의 크기가 큰 경우에는 알맞게 조정됩니다. 단, 영역 외로 그리지 못하게 했다면 해당 영역에 그려지는 부분만 화면에 노출됩니다. 이런 식의 텍스트를 그린다고 했을 때, 빨간 색 영역만큼을 텍스트 레이아웃으로 정하게 한 뒤, 문자열을 그리게 하면, ex의 일부만 나오게 되는 것입니다. 이렇게 말이..
Direct2D의 DirectWrite를 되짚어봅니다. DirectWrite DirectWrite[# 이하 DWrite]는 Direct2D에서 텍스트를 그리기 위한 인터페이스입니다. 필요 항목 DWrite는 사용하기 위해 아래의 내용이 필요합니다. ID2D1Factory ID2D1HwndRenderTarget IDWriteFactory IDWriteTextFormat ID2D1SolidColorBrush 초기화 순서 DWrite는 아래의 순서로 초기화를 진행합니다. Direct2D의 기반이 되는 ID2D1Factory를 초기화하고, 그렇게 만들어진 팩토리 객체로 하위 두 개[# ID2D1HwndRenderTarget, IDWriteFactory]의 객체를 추가로 초기화합니다. 그리고 각각의 객체를 통해 ..
텍스트 출력하기 1에서 구성한 코드를 기반으로 이제 출력하는 코드를 작성합니다. OnPaint 구성 이제 DirectWrite를 사용하기 위해 OnPaint 메서드를 구성하겠습니다. OnPaint 메서드를 구성하고 난 뒤, HandleMessage 메서드에 WM_PAINT와 OnPaint 메서드를 바인딩합니다. //mainWin.h - MainWindow private: LRESULT OnCreate(); LRESULT OnPaint(); // mainWin.cpp LRESULT MainWindow::OnPaint() { return 0; } // mainWin.cpp - HandleMessage switch (uMsg) { case WM_CREATE: { return OnCreate(); } case ..