2014-09-20 6 views
0

와 모양을 그리기 : 나는 마우스를 드래그하여 무료로 모양을 그릴 할I 코드가 GLUT_DOUBLE 모드

#include <gl/glut.h> 
#include <stdio.h> 

#define WinW 1000 
#define WinH 500 
/* ----------------------------------------------------------------------- */ 

bool mousedown = false; 

void myInit(void) { 
    glClearColor(1.0, 1.0, 1.0, 0.0); 
    glColor3f(1.0, 0.0, 0.0); 
    glPointSize(5.0); 
    glShadeModel(GL_SMOOTH); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, WinW, WinH, 0.0, -1.0, 1.0); 
} 

void myDisplay(void) { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_POINTS); 
    glColor3f(1.0, 0.0, 0.0); 
    glVertex2i(50, 50); 
    glEnd(); 

    //glFlush(); 
    glutSwapBuffers(); 
} 
void myMouse(int button, int state, int x, int y){ 
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){ 
     mousedown = true; 
    } 
    else 
     mousedown = false; 
} 
void myMovedMouse(int mouseX, int mouseY){ 
    if (mousedown){ 
     //printf("%d %d\n", mouseX, mouseY); 
     glBegin(GL_POINTS); 
     glColor3f(0.0, 1.0, 0.0); 
     glVertex2i(mouseX, mouseY); 
     glEnd(); 

     //glFlush(); 
     glutSwapBuffers(); 
    } 
} 

/* ----------------------------------------------------------------------- */ 

int main(int argc, char *argv[]) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(WinW, WinH); 
    glutInitWindowPosition(100, 150); 
    glutCreateWindow("Computer Graphic"); 

    myInit(); 
    glutDisplayFunc(myDisplay); 
    glutMouseFunc(myMouse); 
    glutMotionFunc(myMovedMouse); 

    glutMainLoop(); 
} 

합니다.
나는 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)glFlush()으로 시도했지만, 나에게 도움이된다.
GLUT_DOUBLEglutSwapBuffers()myMovedMouse()에 사용하면 화면이 깜박입니다 (흑백 - 흰색 ...)
저는 OpenGL을 처음 접했고 누구든지이 문제를 해결할 수 있습니다.
도움 주셔서 감사합니다!

답변

1

이중 버퍼링을 사용하는 경우 각 다시 그리기에서 모든 점을 그려야합니다. 따라서 모든 포인트 목록을 유지해야합니다. 단계는 다음과 같습니다.

  1. 시작할 때 빈 지점 목록을 만듭니다. 멋진 코드를 원한다면 x와 y 위치에 대한 두 개의 값을 포함하는 클래스/구조체를 정의하고 std::vector과 같은 C++ 컨테이너를 사용하여 포인트 목록을 만드십시오.

  2. 마우스 입력에서 새 포인트를 얻으면 해당 포인트를 포인트 목록에 추가하고 glutPostRedisplay()으로 전화하십시오.

  3. myDisplay() 함수에서 목록의 모든 점을 그립니다.

포인트 목록을 유지하면 단일 버퍼링을 사용할 때보 다 복잡성이 증가 할 수 있습니다. 그러나 조금 더 멀리 가면 어차피 필요할 것입니다. 예를 들어 사용자가 창 크기를 조정하면 어쨌든 모든 점을 다시 그려야합니다. 그래서 싱글 버퍼링 모드로 하나씩 포인트를 그리는 것은 당신을 아주 멀리하지 않을 것입니다.