WinAPI 58 Alpha Blending (2)

CJB_ny·2022년 10월 5일
0

WinAPI

목록 보기
61/79
post-thumbnail

오늘 배운거 👍👍👍

  • 알파 블렌딩 구현후 -> CameraEffect적용후 -> FadeOut/In 효과 구현

  • GetObject의 역할

  • Texture클래스와 CameraManager의 동작방식 이해

  • 비트맵 정보


카메라에 특수 효과를 적용할 것이다.

FADE_OUT이면은 화면 전체가 검은색으로 채워지면 된다.

어떻게 출력되어야 절반 쯤 어두운 것일까?

직접 텍스트 만들기

우리가 이런식으로 비트맵을 직접 만들었었다. 이중 버퍼링 사용을 위해서

굳이 텍스쳐를 인터넷에서 안 구해도 가능하다.

우리가 지금은

ResourceManager를 반드시 통해서 Load를 해서 실제 존재하는 비트맵 이미지를 들고왔는데 (지원하는게 로딩밖에 없어서)

이것을 로드를하면은 BitMapHandle이랑 DC를 만들어서 이것을 Texture라했다.

이게 아니라 직접 메모리상에서 Create하는 경우도 있다.

리소스 매니져도 이렇게 만드는 기능을 지원 해주도록 하자.

직접 비트맵 만드는 부분

Core에서

이런식으로 이중버퍼링을 하기위해서 만들었었다.

구현 ❗❗❗

LoadTexture와 로드 하는 기능을 제외하면 거의 똑같고

Texture에서 Create하는 기능만 지원하면 끝난다.

비트맵 만들기 ❗

CCore의 mainDC들고와서 비트맵과 dc를 만들어 준다.

그리고 추가적으로

기존의 옛날 비트맵은 삭제를 해주도록 한다.

Core 수정

현재 이중 버퍼링이 만들어졌던 부분을 1번 방식처럼 했다면은

이제는 Texture를 생성해내서 이 녀석에다가 실제 그림을 그릴 백버퍼를 만든것이다.

렌더링 부분에서 메모리 DC용 백버퍼 텍스쳐는 _bufferTexture이다.

이녀석의 DC를 얻어와서 Rectangle의 첫번째 인자에 넣어 주도록 하자.

_bufferTexture이녀석이 앞으로 그림이 그려질 텍스쳐이기 때문이다.

그래서 _bufferTexture에 막 그림을 그린다음에

최종적으로 Bitblt함수를 통해 mainDC인 h_dc에다가 최종장면을 복사를 할 것이다.

카메라 매니져

카메라 매니져를 좀 수정을 할 것인데

먼저 화면의 해상도 정보를 알아야하기 때문에

최초로 CameraManager의 싱글톤이 호출이되는 순간을 잡기 위해

init함수를 구현을 해주도록 하자.

이렇게 집접 Create를 해주도록 하자.

그런데 이 텍스쳐의 초기 색상을 검은색으로 채워 주어야한다.

그래야 이 초기 색상을 다른 물체들과 섞을 것이니까..

검은색 00 00 00 이다.

따라서 이렇게 직접 Create하였을 경우 픽셀 메모리 버퍼가 전부다 0으로 밀려있다.

구현할 부분

카메라가 어떤 효과가 진행중이냐에 따라서 최종장면 직전에 카메라서 Alpha Blending을 하여 색을 섞어서 (원하는 만큼 섞어서) -> 색을 출력하면은 된다.

CameraManager의 render를 구현후 Core에서 이제 씬의 모든 물체 다 render한다음에

아까 만들어준 버퍼 텍스쳐를 렌더링을 해주어야한다.

이렇게 구현을 하는데 한가지 더 필요한 정보가 있다.

'시간' 몇초에 걸쳐서 할 것인지 말이다.

render 구현

현재 이런 구조인데

Alpha값이 점점점점점점점 어두워 질 것이다.

아마도 duration과 _curTime에 따라 Alpha값이 변해야 할 것이다.

FADE_OUT일 경우 점점점 어두워 져야하니까

검은색 텍스쳐의 알파값은 0 ~> 255로 가야한다.

검은색 텍스쳐의 입장에서는 본인의 알파값이 0일때 없는 취급이다.

가장 밝은 상태이다.

=> 현재 알파값을 알파블렌딩을 통해 계산을 해서 셋팅을 해주어야한다.

비율값 얻어야한다.

duration / curTime ? 인가?

지속시간이 3초일 때, 검은색 텍스쳐의 값은 0 ~> 255로 흘러야하니까

256을 3초로 나눈다.

현재시간에서 전체시간을 나누어준다?

비율 구하기

현재 시간을 지속시간으로 나눈다. 이게 비율.

0~1 나오니까.

그래서 이 비율값을 알파 최대치의 값에다가 곱해 주어야한다.

ratio는 0.3, 0.7 ... 이런식의 값이 나오니까.

구조체 채우기 ❗

구조체를 만드는데 현재 SRC_ALPHA를 사용하면 안된다.

내가 자체적으로 만든것은 메모리 상에서 직접 만드것이라 기본적인 비트맵 포맷이라서..

그래서 픽셀들은 자기 자신만의 알파값을 사용하는게 아니라

이 105줄의 전역알파값만들 적용받으면된다.

전역알파값

모든 픽셀들한테 강제적으로 알파값 적용시키는 부분이다.

이런식으로 가능 할 것이다.

비트맵 구조체 ❗❗

이런식으로 만들어 주었었는데

Alpha Blend를 적용 시킬 때 Width, Height가 없다.

그래서 비트맵 Create할 때

이부분 추가를 해주고 _objectInfo부분을 채워 주어야한다.

ㅇㅋ?

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글