OpenGL

[펌][OpenGL Tip] OpenGL Font 재미있는 사실

Binceline 2014. 2. 25. 07:20

출처 : http://aslike.egloos.com/2762856


오늘... 우연히 발견했지만

 
같은 OpenGL코드도 그래픽카드 제품군에 따라 다르게 처리된다는 엄청난(?) 사실을 발견하게 되었다

폰트를 출력하면서 발견한 것인데 일단 초기화 코드를 보자
   1: int InitGL(GLvoid)
   2: {
   3:     glClearColor (1.f, 0.f, 1.f, 0.0);
   4:     glEnable(GL_BLEND);
   5:     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
   6:     
   7:     // 문제가 되는 부분!! //
   8:     glPixelZoom(1, -1);
   9:     /////////////////////
  10:  
  11:     glMatrixMode(GL_MODELVIEW);
  12:     glLoadIdentity();
  13:     
  14:     // Font
  15:     HFONT font;
  16:     base = glGenLists(96);
  17:     font = CreateFont(-12, 0, 0, 0, FW_NORMAL, 
  18:                       FALSE, FALSE, FALSE, 
  19:                       ANSI_CHARSET, OUT_TT_PRECIS, 
  20:                       CLIP_DEFAULT_PRECIS, 
  21:                       ANTIALIASED_QUALITY, 
  22:                       FF_DONTCARE | DEFAULT_PITCH, 
  23:                       "Courier New");
  24:     SelectObject(hDC, font);   
  25:     wglUseFontBitmaps(hDC, 32, 96, base);
  26:     
  27:     return TRUE;
  28: }
 
바로 문제가 되는 부분은 glPixelZoom() 함수에서 이다

사실 이 함수를 사용하는 목적은 이전에도 서술했지만

glDrawPixels()를 사용. 즉, 2D이미지 출력을 위해서다

OpenGL의 좌표계가 왼쪽 밑에서부터 올라오기 때문에

일반 윈도우 좌표계처럼 해주기 위해서 glPixelZoom(1, -1)의 조작으로

왼쪽 위에서부터 내려오도록 바꿔준 것이다

흥미로운 사실은 이게 wglUseFontBitmap()에 미치는 영향이다

위에서 리스트로 폰트를 만들고 다음 함수를 이용하여 글자를 찍는다
   1: void glTextOut(const char* str)
   2: {
   3:     glPushAttrib(GL_LIST_BIT);
   4:     glListBase(base - 32);
   5:     glCallLists(strlen(str), GL_UNSIGNED_BYTE, str);
   6:     glPopAttrib();
   7: }
엔비디아 계열의 그래픽카드에서는 글자를 찍는데 glPixelZoom()의 호출과 상관없이

반듯하게 찍혔는데...
그러나...

ATI 계열의 그래픽카드에서는 글자가 glPixelZoom의 영향을 받아

뒤집혀서 찍힌다는 흥미로운 사실을 발견했다;;;
결론은...

윈도우에서 OpenGL로 코딩할 때는...

반드시 양쪽 그래픽 카드로 결과가 동일하게 나오는지 확인할 것!!!


반응형

'OpenGL' 카테고리의 다른 글

.OBJ 파일 포맷  (0) 2014.06.30
[OpenGL][Win32 api] Tutorial  (0) 2013.12.08
[펌][OpenGL] GL_CULL_FACE / GL_DEPTH_TEST  (0) 2013.12.07