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