2011-05-22 61 views
6

這是我的一個簡單的opengl程序。我在繪製三角形之前嘗試清除屏幕。我在我的init()函數中調用了glClear(),但是,它似乎沒有清除屏幕。爲什麼glClear不能清除我的屏幕?

#include <stdio.h> 
#include <stdlib.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

void myIdleFunc() 
{ 
    glBegin(GL_TRIANGLES); 
    { 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex2f(0.0f, 1.0f); 
     glVertex2f(-1.0f, -1.0f); 
     glVertex2f(1.0f, -1.0f); 
    } 
    glEnd(); 

    glFlush(); 

    usleep(1000000); 
} 

void init() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow("Hello, World!"); 

    init(); 

    glutIdleFunc(myIdleFunc); 
    glutMainLoop(); 
    return 1; 
} 

這是一個屏幕截圖,文本來自gnome終端在後臺。

enter image description here

+8

這實際上看起來真的不錯。也許你應該像這樣:) – 2014-02-20 20:29:07

回答

4

哪裏是你的顯示器的回調?您不應該使用空閒功能進行繪圖。

所有的繪製需要發生在適當的回調中,GL上下文可能不會有效,直到glutMainLoop開始運行,並且沒有活動的上下文,你的命令只是被忽略(無背景下,甚至可能不是一個地方用glGetError存儲錯誤以進行檢索)。

注:通常你需要在每幀的開始清除緩衝區。你可能不會用單緩衝清理一次,但雙緩衝更好,並且需要以某種方式呈現每個交換之間的整個區域。

+0

謝謝。爲什麼不使用閒置功能進行繪圖?我的意思是我需要反覆畫這個三角形。顯示功能不是在沒有任何特殊事件發生時繪製的? – trVoldemort 2011-05-22 03:51:10

+0

@tr:我不知道,我不使用GLUT。但是,失敗的代碼不在任何回調中,它在GLUT開始其循環之前,因此GL可能無法使用。 – 2011-05-22 03:55:41

+0

上下文在glutCreateWindow中創建並激活,而不是在glutMainLoop中創建和激活。所以他的代碼工作(但不是他想的)。 – 2011-05-22 11:40:41

0

我不使用GLUT而是一個非常簡單的方法來顯示這樣的事情是:

while(!done) { /* Loop until done. Do drawing. */  

    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    glBegin(GL_TRIANGLES); 
    { 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex2f(0.0f, 1.0f); 
     glVertex2f(-1.0f, -1.0f); 
     glVertex2f(1.0f, -1.0f); 
    } 
    glEnd(); 

    glFlush(); 
    SwapBuffers(); 

    etc... event handling.... 
} 
1

你的問題是,你做清屏在初始化代碼。但是你需要清除它的每一幀,所以在你的顯示開始(或在你的情況下空閒)功能。

0

運行這段代碼,也許你會得到解決。

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

double x_0 = -100; 
double y_0 = -25; 

double x_1 = 100; 
double y_1 = -25; 

double x_2 = 100; 
double y_2 = 25; 

double x_3 = -100; 
double y_3 = 25; 

void 
init(void) 
{ 
    /*initialize the x-y co-ordinate*/ 
    glClearColor(0,0,0,0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(-320, 319,-240, 239); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glFlush(); 
} 

void 
drawRectangle() 
{ 
    glBegin(GL_LINES); 

    glVertex2d(x_0, y_0); 
    glVertex2d(x_1, y_1); 

    glVertex2d(x_1, y_1); 
    glVertex2d(x_2, y_2); 

    glVertex2d(x_2, y_2); 
    glVertex2d(x_3, y_3); 

    glVertex2d(x_3, y_3); 
    glVertex2d(x_0, y_0); 

    glEnd(); 
    glFlush(); 
} 

int 
main(int argc, char *argv[]) 
{ 
    double x_0, y_0, x_1, y_1; 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(640, 480); 
    glutInitWindowPosition(400, 400); 

    glutCreateWindow("Clear Screen"); 
    init(); 
    drawRectangle(); 
    /* clear the screen. You can uncomment following three lines to view the effect of clearing */ 
// glClearColor(0, 0, 0, 0); 
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// /* don't forget to flush */ 
// glFlush(); 
    /***/ 
    glutMainLoop(); 
} 

編譯並運行 -

gcc file.c -lglut -lGLU -lGL 
./a.out