본문 바로가기

Developement/C/C++

Polygon Fill, Anti-Alias 적용 폴리곤 채우기


 이전의 폴리곤 채우기를 만든 후, fl_imgtk 를 업데이트 하다 보니, 부드러운 alias 처리를 한 polygon 을 만들어 볼 필요가 생겼습니다.

그래서 여러가지 생각을 해 본 후, 빠르게 도달한 방법은 보통 게임에서 많이 쓰고 있는 Full Screen (여기선 Full Image) Anti-Alias !

그냥 그리려는 이미지를 4배 ( 실제 변 길이는 2배씩이나, 실제 메모리는 4배가 됩니다.

즉, 2x2 에서 4x4 가 되면 면적은 4배가 되는 원리 ) 크게 만들어 두고 여기다 그리려는 좌표를 두배씩 연산해서 그린 다음, 이걸 다시 fl_imgtk 의 fast rescale 엔진을 이용해서 Bicubic resize 를 적용하면 되는 것 이었습니다. OpenMP 를 사용하기 때문에 오래 걸리는 점은 없는 듯 합니다만, 아래 처럼 각 영역을 확대 해 보면 차이가 납니다.



 3번 포인트 영역, 원래 이미지는 alias 가 그대로 보이는 형태 였을 테나, resize 되면서 그 간섭사이의 보상이 이루어 지면서 부드러운 처리가 됩니다. 그냥 단순히 Blur 를 하면 저런 단계적인 처리가 불가능 합니다.


 경사가 완만한 7번 영역도 위와 같습니다. 부드러운 폴리곤 모서리들은 역시 단순히 4배 크게 그려놓고 원래 그리려는 이미지 크기로 줄이되, 간섭을 완만히 하는 필터를 쓰면 된다 ! 가 결론 입니다.


 이로서 Polygon fill 및, smooth line 을 fl_imgtk 에 포함 해 다음 버젼의 기능을 추가 하게 되었습니다.  ( 아래는 실행 가능한 windows 64bit EXE 압축본)


fltk_plyfill_test_day04.zip




 아래는 덤으로 만든 Smoothen Line 그리기. Wiki 에 있는 우 박사님 알고리즘을 이용해서 구현 해 보았으며, 이 방법은 Polygon 을 그리는것과 달리 이미지를 몇 배 더 크게 만들 필요가 없었습니다.



 선을 부드럽게 그릴때는 선의 error 수에 따른 alpha 값을 가지도록 만들어 졌기 때문에, 선이 겹치는 부분에 원래 그려진 선의 색 성분이 적용 되어 투명도인 alpha 가 정해지므로 아래 이미지 처럼 부드러운 처리가 가능 합니다.




 이 기능 역시 fl_imgtk 에 포함시킬 예정이며, 게임을 하나의 버퍼에서 그려대는 형태로도 제작이 가능해 보입니다, 예를 들어 레이져를 쏘고 맞추는 2차원 게임 정도?


 해당 소스는 곧 업데이트 될 fl_imgtk 에서 확인이 가능 합니다.


 위 라인 그리기 데모는 아래에서 다운로드 가능 합니다 ( Windows 64bit OpenMP 바이너리 )


fl_img_smooth_line.zip