2016-01-14 23 views
1

我在Mac OS X上使用GLUT和OpenGL。當我通過拖動窗口邊緣來調整窗口大小時,窗口被填充了垃圾值。代碼附在下面。去除垃圾的唯一方法是調用glClear(),當然,我不想這樣做。在OpenGL中調整窗口大小:垃圾輸出

問題是,我不想垃圾值。我無法弄清楚爲什麼我也能得到這樣的價值。

#include <stdio.h> 
#include <stdlib.h> 

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
#else 
#include <GL/glut.h> 
#endif 

void myInit(); 
void display(); 
void reshape(int x, int y); 
void keyboard(unsigned char c, int x, int y); 
void mouse(int b, int s, int x, int y); 


int width; 
int height; 

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

    glutInit(&argc, argv); 
    myInit(); 
    glutMainLoop(); 
    return 0; 
} 


void myInit(){ 
    glutInitDisplayMode(GLUT_MULTISAMPLE); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(100,100); 
    glutCreateWindow("Hello World!"); 

    glClearColor(0.2,0.2,0.2,1); 
    glutDisplayFunc(display); 

    glutKeyboardFunc(keyboard); 
    glutMouseFunc(mouse); 

    glutReshapeFunc(reshape); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    gluLookAt(0.0, 0.0, 0.5,\ 
     0.0,0.0,0.0,\ 
     0.0,1.0,0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
} 

void display(){ 
    printf ("))display\n"); 
    glFlush(); 
} 

void keyboard(unsigned char c, int x, int y){ 
    if (c == 27 || c == 81 || c == 113) exit(0); 
    else if (c == 67 || c == 99){ 
     printf("CLEAR!\n"); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glutPostRedisplay(); 
    } 
} 

void putDot(int x, int y){ 
    glBegin(GL_POINTS); 
     glVertex3f(x,height-y,0); 
    glEnd(); 
    glutPostRedisplay(); 
} 

void mouse(int b, int s, int x, int y){ 
    if (b == GLUT_LEFT_BUTTON && s == GLUT_DOWN){ 
     printf("MouseD\n"); 
     putDot(x,y); 
    } 
} 

void reshape(int x, int y){ 
    printf ("))reshape\n"); 
    width = x; 
    height = y; 
    glViewport(0,0,width,height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0,width, 0,height, -10,10); 
    glMatrixMode(GL_MODELVIEW); 
    glutPostRedisplay(); 
} 

編輯:我在Ubuntu 14.04類似的問題。所以麻煩一定是我的編碼(當然!)。

+0

這裏有個問題,或者你只是告訴我們關於你的程序? – immibis

+0

謝謝,我已經看到了這個問題。那邊的問題與我的不同。我想知道我調整大小的方式是引入垃圾值還是其他值。如果是這樣,那是什麼? – Harsh

+2

重新調整大小後,您不會重繪場景。這就是你看到垃圾的原因。在另一個問題中,您遇到與用戶相同的問題:您的顯示功能不能清除屏幕並重新繪製場景。 – BDL

回答

3

OpenGL不是一個場景圖(我已經停止了多少次,我已經把它寫在SO上了)。它只是將點,線和三角形逐個繪製到像素幀緩衝區。一旦事情被繪製就是了。

調整窗口大小時,其幀緩衝區佈局會發生變化。如果像素被添加,它們的初始值是undefined。它就在你身上,用這些值填充這些像素。通常,在調整窗口大小時,操作系統會向您的程序發送消息,表明它需要重新繪製窗口內容。 GLUT使用顯示回調。您的程序的顯示回調不會執行任何操作(除非調用glFlush,否則,如果沒有繪圖調用,則該操作無效)。

您的唯一繪圖調用發生在輸入事件處理程序中。這絕對是錯誤的地方做繪圖調用,至少不要到主窗口framebuffer。對於什麼是值得的,甚至可能在事件處理程序中沒有OpenGL上下文(在GLUT中,但是恕我直言,這是一個疏忽)。在事件處理程序中,您只應處理事件並設置稍後控制繪圖的變量。

所有的繪製(這意味着到glVertexglDraw…調用)應只發生(只有)在GLUT顯示回調(或通過幀緩衝區對象去一個離屏渲染/紋理)。

如果你是一個新手,你正在使用GLUT有一個簡單的規則,將讓你落入陷阱最多:必須沒有調用函數開始gl…(這並不意味着glut…glew…,只是gl,然後大寫)除了顯示回調函數之外的任何函數(我知道大多數,如果不是所有的教程都違反了這個規則;不要讓他們欺騙你)。如果你遵循這個規則,你會發現OpenGL新手問題出乎意料的大部分消失了。

+0

感謝您清除一些事情!實際上,我在查看http://stackoverflow.com/questions/11695977/glutdisplayfunc-displays-garbage上的其他答案,並在您回答這裏時重新編制了我的程序。我以前認爲在每個刷新週期清除+繪製都很麻煩,並且可能會減慢程序的速度。看起來這不完全正確。 – Harsh