IDL/Direct Graphics

DG 체계에서 Z-buffer 사용 방법 (업데이트 버전)

이상우_idl 2016. 9. 2. 12:17
728x90
반응형

제가 꽤 오래전에 여기 올렸던 게시물들 중에, DG 체계에서 Z-buffer를 사용하여 그림을 저장하는 방법에 관하여 소개한 내용이 있었습니다. 즉, Direct Graphics 체계에서 화면상에 그래픽창을 띄우지 않고 그냥 메모리상에서만 조용히 작업이 진행되면서 결과물을 그림 파일로 저장하는 방법을 이 게시물에서 소개했었습니다. 그런데 IDL의 최근 버전에서는 이 내용에 추가적으로 주의를 해야 할 사항이 더 있는 것이 확인이 되었습니다. 따라서 이와 관련하여 내용을 약간 보충하고자 합니다. 예제 코드부터 먼저 본다면, 그 내용은 다음과 같습니다.

 

SET_PLOT, 'Z'

DEVICE, DECOMPOSED=0

DEVICE, SET_RESOLUTION=[600, 600], SET_PIXEL_DEPTH=24

LOADCT, 5

x = FINDGEN(101)/100

data = x^2

PLOT, x, data, /NODATA, COLOR=0, BACKGROUND=255, CHARSIZE=1.5, THICK=3, $

  XTITLE='X Axis', YTITLE='Y Axis'

OPLOT, x, data, COLOR=120, THICK=2

XYOUTS, 0.3, 0.8, 'This is a!Ctest plot', CHARTHICK=2, CHARSIZE=3, $

  COLOR=48, ALIGNMENT=0.5, /DATA

cap = TVRD(/TRUE)

LOADCT, 0

DEVICE, /CLOSE

SET_PLOT, 'X'

HELP, cap

WRITE_PNG, 'test_zbuffer.png', cap

 

이 예제 코드를 실행하면, 작업 디렉토리 내에 test_zbuffer.png라는 이름의 그림 파일이 생성될 것입니다. 이 그림의 모습은 다음과 같습니다.

 

 

 

 

이러한 작업에서 가장 주목해야 할 점은, 모니터 화면상에서는 전혀 아무 일이 발생하지 않는다는 것입니다. 통상적으로는 그래픽창이 뜨고 그 위에 그림이 그려지는 등의 일들이 벌어지겠지만, 그래픽 디바이스가 Z-buffer로 설정된 경우에는 모든 작업이 메모리상에서만 진행되기 때문에, 실제 컴퓨터 화면상으로는 아무 것도 나타나지 않게 됩니다. 그리고 위 예제 코드에서 유의할 점은, 하단에서 사용된 SET_PLOT 명령의 인자가 'X'로 되어 있는데 이는 Linux, Solaris, Mac OS와 같은 OS에 해당됩니다. Windows OS에서는 'X' 대신 'Win'이 되어야 한다는 점을 꼭 명심해야 합니다.

 

제가 예전에 올렸던 게시물에도 유사한 내용의 예제 코드가 있었습니다. 하지만 이번 예제 코드에서 보이는 가장 큰 차이점은 초반에 등장하는 DEVICE 명령에서 SET_PIXEL_DEPTH=24라는 키워드를 추가했다는 점입니다. 이 키워드는 Z-buffer 메모리상에서 색상의 깊이(depth)를 24비트로 해석할 것을 명시적으로 설정하는 역할을 합니다. 특히 저장할 그림이 흑백이 아닌 컬러 색상을 갖는 그림이 되어야 할 경우라면 이 키워드는 반드시 사용하는 것이 좋습니다. 물론 IDL이 설치된 OS에 따라서는 이 키워드를 생략해도 문제가 없는 경우도 있지만, 명확한 설정을 위해서는 그냥 반드시 사용해야 하는 것으로 생각해두는 것을 권장합니다.

 

이러한 Z-buffer를 이용한 작업이 필요한 경우들이 많지는 않지만 실제로 가끔은 상황에 따라 존재합니다. 다만 이러한 방법을 사용하는데 있어서 주의할 점이 몇가지 있는데요. Z-buffer 기반으로 그려지고 생성된 그림의 전반적인 레이아웃이, 화면상의 그래픽창으로 보는 모습과 약간 틀릴 수 있습니다. 따라서 코드상에서 사용된 각종 그래픽 명령들의 키워드 등의 설정값들을, Z-buffer에서 저장된 그림 파일을 확인하면서 튜닝을 좀 해줘야 할 수 있습니다. 물론 얼마나 튜닝이 필요한가는 OS에 따라서 다를 수도 있습니다. 이 부분이 약간 귀찮을 수는 있다는 점을 염두에 두는 것이 좋겠지요.

 

사실 DG 체계에서 그려진 그림은 전반적으로 투박합니다. 이것은 DG 체계의 특성상 어쩔 수 없는 부분이 있습니다. 물론 최근에 도입된 NG(New Graphics) 체계를 사용하면 제법 깔끔한 모습의 그림을 얻을 수 있지만, 과거 NG가 없던 시절에는 별다른 선택의 여지가 없었습니다. 그래서 이 당시에는 DG 체계에서 깔끔한 모습의 그림을 얻는 방법들을 IDL 유저들이 고민하고 나름의 방법들을공유하기도 했었는데요. 그 중 대표적인 방법 하나를 소개해보고자 합니다. 긴 설명은 가급적 생략하겠습니다. 일단 예제 코드는 다음과 같습니다.

 

SET_PLOT, 'Z'

DEVICE, DECOMPOSED=0

DEVICE, SET_RESOLUTION=[3600, 3600], SET_PIXEL_DEPTH=24

LOADCT, 5

x = FINDGEN(101)/100

data = x^2

PLOT, x, data, /NODATA, COLOR=0, BACKGROUND=255, CHARSIZE=8, CHARTHICK=8, THICK=8, $

  XTHICK=4, YTHICK=4, XTITLE='X Axis', YTITLE='Y Axis'

OPLOT, x, data, COLOR=120, THICK=8

XYOUTS, 0.3, 0.8, 'This is a!Ctest plot', ALIGNMENT=0.5, CHARSIZE=16, CHARTHICK=8, $

  COLOR=48, /DATA

cap = TVRD(/TRUE)

LOADCT, 0

DEVICE, /CLOSE

SET_PLOT, 'X'

HELP, cap

cap = REBIN(cap, 3, 600, 600)

HELP, cap

WRITE_PNG, 'test_zbuffer_shrinked.png', cap

 

사실 이 내용을 얼핏 보면 첫번째 예제 코드와 별 차이가 없어 보일 수도 있지만, 실제로는 그렇지가 않습니다. 가장 주목해야 할 부분은 초반 DEVICE 명령에서 Z-buffer 메모리상에 만들어지는 그래픽창의 크기를 상당히 크게(3600X3600) 잡았다는 점입니다. 그리고 후반부 그림 파일 저장 직전에 REBIN 함수를 사용함으로써, 저장될 그림 자체의 사이즈는 원래 의도인 600X600이 되도록 한 부분도 좀 특이합니다. 이것은 메모리상에서는 그림의 크기를 아주 크게 그려놓은 후 마지막 저장 직전에 축소를 시키는 방법인데요. 이렇게 얻어지는 그림의 모습은 실제로 다음과 같습니다.

 

 

 

어떻습니까? DG 체계에서 얻어진 그림 답지않게 상당히 깔끔한 모습인 것을 확인할 수 있습니다. 물론 이 방법이 제대로 먹히기 위해서는 중간중간에도 약간 귀찮은 손질들이 필요합니다. 위 예제 코드에서 PLOT, XYOUTS 등을 보면 키워드들이 좀 더 많이 사용된 것을 볼 수 있는데요. 문자들의 크기, 두께를 매우 크게 하였고, 선의 두께도 매우 크게 설정하고 있습니다. 이렇게 해놔야 나중에 축소될 때 우리 눈에 보기 좋을 정도의 크기 또는 두께가 되기 때문입니다. 따라서 이러한 손질을 위하여 어느 정도의 튜닝을 해줘야 하는가에 대해서는, 저장되는 그림을 봐가면서 몇번의 시행착오를 거칠 수 밖에 없다는 점은 있습니다. 이 부분은 유저의 선택의 문제라고 볼 수 있습니다.

 

저도 실제로 예전에 이런 방법을 사용하여 그림을 그려서 논문이나 프리젠테이션 용으로 사용했던 경험이 있습니다. 따라서 최근 버전의 IDL을 사용한다 하더라도, NG, OG 등의 방법을 사용하는 것이 아직 좀 거북하면서도 DG에서 좀 더 괜찮은 그림을 얻고 싶은 유저라면 한번쯤 시도해볼만한 방법이 아닐까 생각해 봅니다.

반응형