2010-05-24 108 views
8

Tôi muốn thay đổi màu nền của cửa sổ sau khi nhấn nút, nhưng chương trình của tôi không làm việc, ai đó có thể cho tôi biết tại sao, cảm ơn trướcmàu nền trong OpenGL

int main(int argc, char* argv[]) 
    { 
     glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
     glutInitWindowSize(800, 600); 
     glutInitWindowPosition(300,50); 
    glutCreateWindow("GLRect"); 

glClearColor(1.0f, 0.0f, 0.0f, 1.0f); <--- 

    glutDisplayFunc(RenderScene); 
     glutReshapeFunc(ChangeSize); 
    glutMainLoop(); 

    system("pause"); 
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); <--- 

     return 0; 
    } 
+0

Sau khi nhấn "nút nào"? – tafa

+0

Vì 'glutMainLoop()' sẽ không bao giờ trả về cách bạn mong đợi nhận được câu lệnh 'system (" pause ")' và lệnh 'glClearColor' thứ hai? – Troubadour

+0

@tafa: làm cách nào để thay đổi mã của tôi để xem hiệu ứng này? – lego69

Trả lời

17

glClearColor không thực hiện bất kỳ thao tác xóa nào - nó chỉ đặt màu sẽ là khi bạn thực sự rõ ràng. Để tự xóa, bạn cần gọi số glClear với (ít nhất) COLOR_BUFFER_BIT.

Chỉnh sửa: đã khá lâu kể từ khi tôi sử dụng glut, vì vậy chi tiết này có thể sai, nhưng nếu bộ nhớ phục vụ, để thay đổi màu màn hình để phản hồi nhấn phím trên bàn phím, bạn sẽ làm điều gì đó như thế này:

void keyboard (unsigned char key, int x, int y) 
{ 
    // we'll switch between red and blue when the user presses a key: 
    GLfloat colors[][3] = { { 0.0f, 0.0f, 1.0f}, {1.0f, 0.0f, 0.0f } }; 
    static int back; 

    switch (key) { 
    case 27: 
     exit(0); 
    default: 
     back ^= 1; 
     glClearColor(colors[back][0], colors[back][1], colors[back][2], 1.0f); 
     glutPostRedisplay(); 
    } 
} 

void draw() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    // other drawing here... 
} 

int main() { 

    // glutInit, glutInitDisplayMode, etc. 

    glutDisplayFunc(draw); 
    glutKeyboardFunc(keyboard); 
    glutMainLoop(); 
} 

Về cơ bản, bạn thực hiện tất cả bản vẽ theo bất kỳ chức năng nào bạn chuyển đến glutDisplayFunc. Hầu như bất cứ điều gì khác chỉ thay đổi trạng thái, sau đó gọi PostRedisplayFunc(); để nói rõ rằng cửa sổ cần được vẽ lại. Cảnh báo: như tôi đã nói, nó đã được một thời gian kể từ khi tôi sử dụng glut và tôi đã không thử nghiệm mã này. Nó cho thấy cấu trúc chung của một chương trình glut với sự hồi tưởng tốt nhất của tôi, nhưng tôi không mong đợi nó hoạt động chính xác như vậy.

+0

Tôi đã làm điều đó, nhưng nó vẫn không hoạt động, có thể là vấn đề với glutMainLoop? – lego69

+0

Giải pháp này là tốt. Hãy thử sử dụng bộ đệm đôi? glutMainLoop là tốt. Cho tôi biết nếu nó hoạt động với đệm đôi – Laz

0

tôi sẽ tưởng tượng bạn don không có ngữ cảnh OpenGL vào thời điểm đó bạn gọi glClearColor.

Nhưng ...

... Tôi chưa bao giờ sử dụng dư thừa trước để xem nhanh các docs gợi ý rằng bạn sẽ thực sự có một bối cảnh sau khi glutCreateWindow vì vậy có lẽ đó không phải là nó.

Khi nhận xét của tôi về câu hỏi của bạn cho biết tôi rất tò mò về cuộc gọi thứ hai tới số glClearColor và cách bạn nghĩ bạn sẽ tiếp cận nó. Đó có thể là nguyên nhân của vấn đề. Để làm bất cứ điều gì trên một báo chí quan trọng tôi tin rằng bạn sẽ phải đăng ký một cuộc gọi lại bằng cách sử dụng glutKeyboardFunc.

+0

xin lỗi, nhưng tôi không hiểu, tôi là người mới bắt đầu – lego69

+0

Tôi đang làm việc trong Eclipse – lego69