출처 : 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 |