2010-10-05 277 views
2

我正在做一個過剩的窗口中的2D繪圖,我很難正確調整窗口的大小。調整大小窗口的大小

我的glutDisplayFunc和glutReshapeFunc如下。實際上,窗口大小調整時,圖形消失。如果我從displayFunc()中刪除glClear(),新的像素不會「初始化」,並且存在剪輯問題。我該如何解決?

glutDisplayFunc:

void displayFunc() { 
    glDisable(GL_DEPTH_TEST); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize (3.0); 
    glFlush(); 
} 

glutReshapeFunc:

void windowReshapeFunc(GLint newWidth, GLint newHeight) { 
    glViewport(0, 0, newWidth, newHeight); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, GLdouble (newWidth), 0, GLdouble (newHeight)); 

    windowWidth = newWidth; 
    windowHeight = newHeight; 
} 

回答

1

我會嘗試加入一個電話glutPostRedisplay()在你重塑功能的結束。

+0

感謝您的答覆,但似乎並沒有幫助。你能解釋爲什麼你會期待它? – obh 2010-10-06 05:17:19

+1

它會在窗口大小調整後導致顯示更新。然而,仔細觀察一下,你在顯示器中唯一實際的繪圖功能是清除屏幕,所以我不希望發生任何其他事情。我猜你在別的地方有繪畫,實際情況不應該如此。 – 2010-10-06 05:21:18

+0

Diaply每更新一次調用時都會更新,這不是重點,obh請發佈您的完整代碼,以便我們不會猜到。 – 2010-10-11 14:56:13

0

我想你的代碼不會在顯示func的場景中畫出所有東西,你會發現,如果沒有事件發生,你必須調用顯示器一次,並在第一次顯示你的繪圖。但是,如果有事件顯示窗口已調整大小,則問題會增加!嘗試把你的繪圖部分放在顯示功能中。像這樣,

void displayFunc() { 
    glDisable(GL_DEPTH_TEST); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize (3.0); 
    glBegin(GL_POINTS); 
    { 
      //Blah blah blah some points here which you expect to draw 
    } 
    glEnd(); 
    glFlush(); 
} 

請發佈完整的代碼,如果這沒有幫助。

1

您在重塑函數結束時未將矩陣模式設置回GL_MODELVIEW。

void reshape(int width, int height) { 
    glViewport(0,0,width,height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, GLdouble (width), 0, GLdouble (height)); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

很難說如果在沒有看到更多代碼的情況下顯示函數中還有其他內容。我希望有所幫助。

1

你不能用相同的窗口調用gluOrtho2D兩次,它會打破圖形,所以什麼也沒有顯示。您必須初始化窗口大小並將Ortho設置爲屏幕大小(當前顯示分辨​​率),然後相對於窗口大小繪製。

0

這是我使用的基本模板...

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

#define WINDOW_WIDTH 300 
#define WINDOW_HEIGHT 300 

// current Window width and height 
int win_width, win_height; 

void display() 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    // write your code here 
    // 
    // 

    glutSwapBuffers(); 
} 

void on_resize(int w, int h) 
{ 
    win_width = w; 
    win_height = h; 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-w/2, w/2, -h/2, h/2, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    display(); // refresh window. 
} 

void main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
    glutCreateWindow("basic resize template"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(on_resize); 

    glutMainLoop(); 
}