공부/Graphics, DirectX, 포트폴리오 구조

안티 앨리어싱(Anti-Aliasing), 멀티 샘플링(Multi-Sampling), 알파 포괄도 변환(Alpha-To-Coverage)

sudo 2021. 12. 3. 20:04

알파 포괄도 변환(Alpha-To-Coverage)

BlendState를 만들려고 CreateBlendState를 호출하려고 하면 D3D11_BLEND_DESC를 채워주고 인자로 그 주소값을 넣어줘야 하는데, Description에 보면 AlphaToCoverageEnable라는 멤버가 있다.

AlphaToCoverageEnable에 대한 설명을 읽어보자

 

내가 이해한 것을 쉽게 정리하자면 한 픽셀에서 그 도형에서 차지하는 비율과 알파를 곱한 것이다. 예를 들어서 어떤 한 픽셀의 면적의 0.3만큼 어떤 도형이 차지하고, 그 픽셀 알파값이 0.5면 0.3 * 0.5 = 0.15로 그 픽셀의 알파값을 정하는 것이다. 이렇게 하면 경계선이 약간 blur처리된 것 처럼 보여서 계단 현상이 완화될 수도 있을 것 같다.

 

Alpha-To-Coverage의 설명에 나오는 멀티 샘플링에 대해서도 좀 자세히 공부해보면 좋을 것 같다.

 

슈퍼 샘플링(Super-Sampling)과 멀티 샘플링(Multi-Sampling)

계단 현상을 완화하고자 하는 기법들을 안티 앨리어싱이라고 부르는데 그중에 슈퍼 샘플링(Super Sampling)은 안티 앨리어싱을 위한 기법중 한가지이다. 슈퍼 샘플링은 쉽게 생각하면 해상도를 크게 잡는 것이다. 그렇게 하면 해상도 대비 픽셀 하나당 크기가 줄어든다. 늘어난 해상도에서 하나의 픽셀(원래 늘리기 전의 픽셀 크기의 1/4픽셀)을 서브 픽셀이라고 한다. 이 서브 픽셀들의 평균을 사용해서 원래 해상도로 출력해주는 것이다. 이렇게 하면 픽셀 셰이더가 처리하는 픽셀양도 4배로 더 많아지고, 버퍼 크기도 4배가 필요하니 필요한 메모리 양과 연산량이 4배가 된다. 그래서 비용이 큰 기법이다.

https://lipcoder.tistory.com/entry/DirectX-12-%EB%8B%A4%EC%A4%91%ED%91%9C%EB%B3%B8%ED%99%94Multisampling

 

멀티 샘플링(Multi-Sampling)은 사실 슈퍼 샘플링의 특별한 버전이라고 생각하면 된다. 똑같이 4배의 후면/깊이 버퍼를 사용해서 하나의 픽셀당 (그림에서 볼수 있듯이 사각형 픽셀 내에 퍼진) 4개의 작은 샘플을 가진다. 그리고 4개의 샘플 각각에 대해 Bound-Check를 한다. 삼각형에 대해서 멀티 샘플링이 적용되는 중이라면 완전히 삼각형 안에 존재하는 픽셀은 4개의 샘플들 모두가 삼각형 내부에 있겠지만 아래 그림처럼 경계에 걸친 픽셀은 1~3개의 샘플들만 삼각형 내부에 존재하게 될 것이다. 

https://www.youtube.com/watch?v=pFKalA-fd34

Bound Check를 거친 후에 In-Bound 샘플에게만 원래 서브픽셀로 나뉘기 전 중앙에 있는 픽셀이 가진 색을 공유한다. 위의 그림으로 치면 오른쪽 2개의 서브픽셀은 중앙에 있는 픽셀의 색을 공유받지 못하고, 왼쪽이 2개의 서브픽셀만 공유 받아서 그 색으로 업데이트된다. 업데이트 되지 않은 색은 이전에 갖고 있던 색으로 유지된다(지금까지 아무 픽셀 정보도 써주지 않았다면 흰색일수도 있다). 그렇게 4개의 서브픽셀들의 평균을 내서 1개의 픽셀로 보간해내면 우리가 최종적으로 보는 색이 될 것이다.

 

멀티 샘플링이 슈퍼 샘플링보다 효율적인 이유는 슈퍼 샘플링은 후면버퍼/깊이스텐실 버퍼를 4배로 늘리고 서브픽셀 하나당 한번씩 계산해야 하는 반면에(그래서 서브픽셀끼리 색깔이 다를 수 있고, 픽셀 처리량은 4배가 된다), 멀티 샘플링은 픽셀당 한번만 계산하고 그걸 서브픽셀끼리 공유하기 때문이다.

 

구글링하면 해당 내용에 대한 책도 조금 볼 수 있다

 

Reference :

https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-blend-state

 

Configuring Blending Functionality - Win32 apps

Blending operations are performed on every pixel shader output (RGBA value) before the output value is written to a render target. If multisampling is enabled, blending is done on each multisample; otherwise, blending is performed on each pixel.

docs.microsoft.com

https://lipcoder.tistory.com/entry/DirectX-12-%EB%8B%A4%EC%A4%91%ED%91%9C%EB%B3%B8%ED%99%94Multisampling

 

[DirectX 12] 기본지식 - 다중 샘플링(Multisampling)

모니터의 픽셀들이 무한히 작지는 않기 때문에, 모니터 화면에 선을 완벽하게 나타내는 것은 불가능하다. 모니터에 선을 출력했을때 흔히 나타나는 현상이 있는데 이것을 '계단 현상' 또는 앨리

lipcoder.tistory.com

https://www.youtube.com/watch?v=pFKalA-fd34 

https://books.google.co.kr/books?id=bCtnDwAAQBAJ&pg=PT164&lpg=PT164&dq=directX+multisampling+average&source=bl&ots=HsrtNzRG3P&sig=ACfU3U2rOaqVt543IOP77Prci5cDDauU2g&hl=ko&sa=X&ved=2ahUKEwj0687RrMf0AhVQZt4KHdRLCJMQ6AF6BAgcEAM#v=onepage&q=directX%20multisampling%20average&f=false 

 

Introduction to 3D Game Programming with DirectX 11

Frank Luna has been programming interactive 3D graphics with DirectX for more than fifteen years. He is the author of three bestselling books on DirectX and has worked in 3D medical visualization, 3D architectural design software, and gaming. He holds a BS

books.google.co.jp