리눅스 opengl 에서 glDrawBuffer(GL_FRONT) 로 그리면 Y값이 반전되는 현상
글쓴이: kentop / 작성시간: 토, 2016/08/27 - 12:35오후
안녕하세요.
리눅스에서 opengl 개발 중 막히는 곳이 있어서 질문 올립니다.
[ 개발환경 ]
centos 6.4
gcc 4.4.7
x11/xlib
[ 문제점 ]
opengl 2D에 {0,0,100,100} 좌표에 사각형을 그리면
GL_FRONT에 그릴때와 GL_BACK에 그릴때의 결과가 다르게 나옵니다. (Y축 기준으로 반전되어 나옵니다.)
제가 원하는 건
GL_FRONT에 그리던 GL_BACK에 그리던 윈도우의 left-bottom이 원점(0.0)이 되어 그려 주었으면 하는데요.
현재는
GL_BACK에 그릴때는 left-bottom 을 원점(0.0)으로 해서 그리고 GL_FRONT에 그릴때는 left-top을 원점으로 해서 그려집니다.
윈도우에서는 둘다 동일하게 출력이 되는데요
xlib에서 어떤 설정을 해 줘야 하는 건가요 ??
혹시 위 문제를 해결할 방법이 없을까요 ?
감사합니다.
[ 테스트 코드 ]
#include<stdio.h> #include<stdlib.h> #include<X11/X.h> #include<X11/Xlib.h> #include<GL/gl.h> #include<GL/glx.h> #include<GL/glu.h> Display *dpy; Window root; GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; XVisualInfo *vi; Colormap cmap; XSetWindowAttributes swa; Window win; GLXContext glc; XWindowAttributes gwa; XEvent xev; void DrawAQuad() { glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1., 1., 0.); glBegin(GL_QUADS); glVertex2f( 100.0f, 0.0f); glVertex2f( 100.0f, 100.0f); glVertex2f( 0.0f, 100.0f); glVertex2f( 0.0f, 0.0f); glEnd(); } int main(int argc, char *argv[]) { dpy = XOpenDisplay(NULL); if(dpy == NULL) { printf("\n\tcannot connect to X server\n\n"); exit(0); } root = DefaultRootWindow(dpy); vi = glXChooseVisual(dpy, 0, att); if(vi == NULL) { printf("\n\tno appropriate visual found\n\n"); exit(0); } else { printf("\n\tvisual %p selected\n", (void *)vi->visualid); /* %p creates hexadecimal output like in glxinfo */ } cmap = XCreateColormap(dpy, root, vi->visual, AllocNone); swa.colormap = cmap; swa.event_mask = ExposureMask | KeyPressMask; win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa); XMapWindow(dpy, win); XStoreName(dpy, win, "VERY SIMPLE APPLICATION"); glc = glXCreateContext(dpy, vi, NULL, GL_TRUE); glXMakeCurrent(dpy, win, glc); glEnable(GL_DEPTH_TEST); while(1) { XNextEvent(dpy, &xev); if(xev.type == Expose) { XGetWindowAttributes(dpy, win, &gwa); glViewport(0, 0, gwa.width, gwa.height); gluOrtho2D(-0.5, gwa.width-0.5, -0.5, gwa.height-0.5); #if 0 // GL_BACK glDrawBuffer(GL_BACK); DrawAQuad(); glXSwapBuffers(dpy, win); #else // GL_FRONT glDrawBuffer(GL_FRONT); DrawAQuad(); glFlush(); #endif } else if(xev.type == KeyPress) { glXMakeCurrent(dpy, None, NULL); glXDestroyContext(dpy, glc); XDestroyWindow(dpy, win); XCloseDisplay(dpy); exit(0); } } /* this closes while(1) { */ } /* this is the } which closes int main(int argc, char *argv[]) { */
Forums:
그래픽 드라이버를 설치해 주니까 정상 동작합니다.
아래 링크 보고
드라이버를 설치해 주었더니 정상 동작 합니다.
http://saelly.tistory.com/469
기본적으로 nouveau 라는 드라이버가 설치되어 있던데요
여기선 더블 버퍼링이 안되는 건가요 ?
아니면 어떤 설정을 해 줘야 하는 건가요 ?
리눅스 환경은 익숙치 않아서 삽질 투성이 입니다. ㅠㅠ
누가 이글을 찾아 읽고 또다시 이 블로그 링크하는
누가 이글을 찾아 읽고 또다시 이 블로그 링크하는 글이 재생산 될까봐 씁니다.
http://rpmfusion.org/Configuration/ 을 거쳐 http://rpmfusion.org/Howto/nVidia 처럼 합니다.
설치가 편하고 관리가 체계적이며, 원래대로 되돌리기도 쉽습니다.
댓글 달기