我有一個設置功能,設置視口占據整個窗口大小,加載單位矩陣,然後使用gluOrtho2d()
在該視口內設置一個座標系。如果我的這個功能的理解是正確的,我現在應該能夠在y軸呼叫使用座標我的繪圖功能,從0到780的X軸和0至460使用gluortho2d但繪圖功能不使用新的座標
void gl_setup(void) {
glViewport(0,0, 780,460);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,0,780,460);
return ;
}
然而,在我my_display函數,我的形狀根據(-1,1,-1,1)座標系繪製。例如,
glBegin(GL_LINE_STRIP);
glVertex2f(0, -1.0f);
glVertex2f(0, 1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2f(-1.0f, 0);
glVertex2f(1.0f, 0);
glEnd();
繪製兩條線,一條直接下視區的中間從上到下,和一個直接穿過視口的中間從左到右。在我以爲我在上面定義的座標系中,我是否應該使用
glBegin(GL_LINE_STRIP);
glVertex2f(0, 230.0f);
glVertex2f(780, 230.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2f(390.0f, 0);
glVertex2f(390.0f, 460.0f);
glEnd();
或大約那裏?
編輯:繪圖發生在my_display()
函數,這是glutDisplayFunc
回調。這個功能看起來是這樣的:
void my_display(void) {
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(0.1, 0.1, 0.79);
glBegin(GL_LINE_STRIP);
glVertex2f(0, -1.0f);
glVertex2f(0, 1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2f(-1.0f, 0);
glVertex2f(1.0f, 0);
glEnd();
glColor3f(1.0f, 0, 0);
glBegin(GL_LINE_STRIP);
glVertex2f(0.0, -1.0f);
glVertex2f(0.0, -2.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2f(-2.0f, 0);
glVertex2f(-1.0f, 0);
glEnd();
glutSwapBuffers();
return ;
}
編輯2:我的主要功能如下:
int main(int argc, char **argv) {
glutInit(&argc, argv) ;
glut_setup() ;
gl_setup() ;
glutMainLoop() ;
return(0) ;
}
我glSetup以上。 glut_setup()
是我定義我的所有回調:
glutDisplayFunc(my_display);
glutReshapeFunc(my_reshape);
glutKeyboardFunc(my_keyboard);
glutMouseFunc(my_mouse);
而且my_reshape
如下所示,這在我的理解(這可能誠然從真相很遠)保持視每當窗口大小相同的大小,並保持其相對居中:
void my_reshape(int w, int h) {
// update window dimensions
WIN_W = w;
WIN_H = h;
int win_x = (w-780)/2;
int win_y = (h-460)/2;
glViewport (win_x,win_y,780,460);
return;
}
當您將矩陣模式保留在GL_PROJECTION處時,一種瘋狂的猜測就是您重置投影矩陣時使用了一些'glLoadIdentity()'調用或類似的操作。但是到目前爲止所給出的代碼,這是遠未確定的。 – derhass 2014-09-18 17:57:45
你是對的@derhass,我已經添加了實際完成繪圖的全部功能。 – sven 2014-09-18 18:13:12
這還不夠。你在哪裏調用'gl_setup()',並在進入主循環的過程中發生了什麼?其他回調也可能會在這裏產生干擾,如重塑功能。 – derhass 2014-09-18 18:17:33