Screen-Space Alpha Mask 따라하기
알파블렌딩에 관해 알아보면서 알파값이 있는 오브젝트들은 순서에 맞게 렌더링을 해야한다는걸 알게되었습니다.
그런데 간단한 오브젝트들은 문제가 없지만 나무와 수풀 등의 경우에는 단순 거리에 의한 정렬이 전부가 아닌 교차판별등 여러가지 정렬방법을 복합적으로 사용해야 하더군요. 또한 수풀들의 경우엔 2개의 사각형을 X형태로 맞물려 놓아 입체감을 주는 경우가 많은데 그럴경우엔 정렬이 안되겠죠.
그래서 이런저런 방법을 알아보니 알파블렌드 보다는 알파테스트를 사용하거나 Alpha to Coverage라는 방식을 사용하는 듯 합니다.
그중 우연히 Screen Space Alpha Mask 라는 알파블렌딩을 포스트프로세싱으로 처리하는 방법을 보게되었습니다. ( Siggraph2009 'Rendering Technology at Black Rock Studio' )
1. 가장 먼저 불투명한 오브젝트들을 쭉 그려줍니다. (화면에서 좌측 하단)
2. 알파값이 들어가는 오브젝트들의 알파값을 찍어줍니다. 이때 1번에서의 Z버퍼를 참고하여 그려질부분과 그려지면 안될 부분을 가려주고, Z버퍼 작성은 하지 않습니다. (좌측 상단)
3. 알파값이 들어가는 오브젝트들의 색상값을 알파테스트로 그려줍니다. (우측 상단)
4. 2번에서 얻은 알파값을 참고해 3번의 색상값을 1번의 장면에 찍어줍니다. (우측 하단)
결과가 깔끔하게 나와 좋네요..
장점은 정렬에 드는 비용이 없다는거겠고 단점은 알파가 들어가는 오브젝트를 2패스로 렌더링 해야한다는 것 입니다.
그리고 가장 중요한게 안티앨리어싱에 관한 문제입니다. 멀티샘플링을 설정을 하면 제대로 렌더링이 되지가 않더군요.
MRT에서는 MSAA문제 때문에 외곽선값도 따로 저장해 놓는걸로 알고있는데 이 경우에는 일단 단일타겟에서 여러번 렌더링 한 것인데 이유가 생기는 이유가 뭘지...
이번기회에 MRT에 대해서도 알아봐야겠습니다.
그리고 이건 또 다른 문제점입니다.
아무래도 값이 1차원적으로 기록이 되기 때문에 표시된 부분 같은 경우에 알파값에서는 해당 부분처럼 알파값이 높은 물체 앞에 알파값이 낮은 물체가 있으면 알파값이 높은게 우선시 되기에 최종 알파블렌딩시 문제의 부분은 알파테스트로 그려준 값이 그대로 찍힙니다.
아직 궁금점들이 해결되지 않아 찝찝하네요. 슬라이드에서 언급된 것중 약간 이해가 안되는 것도 있고..
특히 알파마스크 생성할때 Add와 Max를 이용한 방법을 각각 보여줬는데 해당 식을 어디서 사용하는지를 모르겠네요. 식으로 검색해보면 XNA HLSL 에서 사용하는 건 나오던데요. DX상의 HLSL에서도 사용할 수는 있을텐데 좀더 알아봐야겠네요..
제가 참고했던 슬라이드파일은 아래의 링크에서 받아보실 수 있습니다.
Moore, Jefferies – Rendering Technology at Black Rock Studios
http://www.bungie.net/images/Inside/publications/siggraph/BlackRockStudio/Siggraph2009_BlackRock.pptx
혹시 이 방식을 통해 구현해보셨거나 해당 슬라이드를 관심있게 보시고 문제점 해결법을 살짝 귀띔해주시면 감사하겠습니다.
관련 정보가 잘 안나오네요 ㅠ,.ㅠ;
'Programming > Shader' 카테고리의 다른 글
| Screen-Space Alpha Mask 따라하기 (0) | 2010/05/20 |
|---|---|
| Per-Pixel Point Light (0) | 2009/12/26 |


댓글을 달아 주세요