2011-03-26 2 views
0

마우스의 수동 동작으로 선을 그려는 중입니다 (책에서 가져온 것입니다).하지만 그럴 수는 없습니다.수동으로 동작하는 OpenGL

float xf, yf, xs, ys; 
int flag=0; 

void setupmywindow() 
{ 
    glClearColor(0,0,0,0); 
    gluOrtho2D(0,100,0,100); 
} 

void myDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glutSwapBuffers(); 
} 

void move(int x, int y) 
{ 

if(flag == 1) 
{ 
glBegin(GL_LINES); 
glVertex2f(xf, yf); 
glVertex2f(xs, ys); 
glEnd() ; 

} 
xf = x/500; 
yf = (500-y)/500; 

xs = x/500; 
ys = (500-y)/500; 
glBegin(GL_LINES); 
glLogicOp(GL_XOR); 
glVertex2f(xf, yf); 
glVertex2f(xs, ys); 
glLogicOp(GL_COPY); 

glEnd() ; 

} 

int main(int argc, char **argv) 
{ 


    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("My window"); 
    setupmywindow(); 
    glutDisplayFunc(myDisplay); 
    glutPassiveMotionFunc(move); 
    glutMainLoop(); 

} 

여기에 sth가 누락 되었습니까?

+0

책의 이름은 무엇입니까? –

답변

0

책에서 바로 복사 할 수 있습니까? 그렇다면 나는 당신이 그것을 읽지 않는 것이 좋습니다! 거의 모든 경우에 드로잉 호출은 DisplayFunc의 시작과 끝 사이에서 수행되어야합니다.

float xf, yf, xs, ys; 
int flag=0; 

void setupmywindow() 
{ 
    glClearColor(0,0,0,0); 
    gluOrtho2D(0,100,0,100); 
} 

void myDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3(1.0f, 1.0f, 1.0f); 
    if(flag == 1) 
    { 
     glBegin(GL_LINES); 
     glVertex2f(xf, yf); 
     glVertex2f(xs, ys); 
     glEnd() ; 
    } 
    glLogicOp(GL_XOR); 

    glBegin(GL_LINES); 
    glVertex2f(xf, yf); 
    glVertex2f(xs, ys); 
    glEnd(); 

    glLogicOp(GL_COPY); 

    glutSwapBuffers(); 
} 

void move(int x, int y) 
{ 
    xf = x/500.0f; 
    yf = (500.0f-y)/500.0f; 

    xs = x/500.0f; 
    ys = (500.0f-y)/500.0f; 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("My window"); 
    setupmywindow(); 
    glutDisplayFunc(myDisplay); 
    glutPassiveMotionFunc(move); 
    glutMainLoop(); 

} 

편집 : 그래서 당신은 당신의 프로그램을 변경해야합니다 빌 Krumlinde 잘 물론, 당신은 시작과 끝 절에서 glLogicOp을 할 수 없어, 나는 수정을 포함하는 위의 코드를 업데이트했습니다.

+0

안녕하세요, 작동하지 않았습니다. ("glCoror3f (1,1,1)"도 추가했습니다.) – George

+0

이 코드를 편집했습니다. 그리고 glCoror3f (1.0f, 1.0f, 1.0f)를 사용하십시오. 그렇지 않으면 바이트 값 (255는 최대 값)으로 해석됩니다. – Hannesh

1

하나의 오류는 glBegin/End 쌍 사이에 glLogicOp 호출이 있다는 것입니다. 시작과 끝 사이에는 아주 적은 수의 OpenGL 호출이 허용됩니다. 이렇게하는 대신 다음과 같이하십시오.

glLogicOp(GL_XOR); 
glBegin(GL_LINES); 
glVertex2f(xf, yf); 
glVertex2f(xs, ys); 
glEnd() ; 
glLogicOp(GL_COPY); 
+0

안녕하세요, 작동하지 않았습니다 – George

1

이 코드가 실제로 책에서 나온 것이라면 그 책은 끔찍한 것이며, 뇌를 손상시키기 전에 그냥 놓아 두어 대신 NeHe tutorials과 같은 더 좋은 (그리고 무료 인) 코드를 찾아야합니다.

나는 선으로, 예를 들어 심각한 문제를 볼 ... 당신은 XF, YF와 XS를 설정하는

xf = x/500; 
yf = (500-y)/500; 

xs = x/500; 
ys = (500-y)/500; 

는 같은 값에 YS는 (그래서 당신의 선은 길이가 0이 될 것입니다) .. 또한 xy이 정수인 경우 해당 구분은 항상 0의 결과를 제공합니다.

+0

네, 맞습니다 ... – George

관련 문제