리눅스 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 처럼 합니다.
설치가 편하고 관리가 체계적이며, 원래대로 되돌리기도 쉽습니다.
댓글 달기