Opengl 使用二维但绘图函数不';不要使用新坐标

Opengl 使用二维但绘图函数不';不要使用新坐标,opengl,2d,coordinates,orthographic,Opengl,2d,Coordinates,Orthographic,我有一个设置函数,它设置视口以占据整个窗口大小,加载标识矩阵,然后使用gluOrtho2d()在该视口内设置坐标系。如果我对这个函数的理解是正确的,我现在应该能够使用x轴上0到780的坐标和y轴上0到460的坐标调用我的绘图函数 void gl_setup(void) { glViewport(0,0, 780,460); glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,0,780,460); ret

我有一个设置函数,它设置视口以占据整个窗口大小,加载标识矩阵,然后使用
gluOrtho2d()
在该视口内设置坐标系。如果我对这个函数的理解是正确的,我现在应该能够使用x轴上0到780的坐标和y轴上0到460的坐标调用我的绘图函数

void gl_setup(void) {
  glViewport(0,0, 780,460);
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0,0,780,460);

  return ;
}
但是,在my_显示功能中,我的形状是根据(-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 ;
}
int main(int argc, char **argv) {
  glutInit( &argc, argv ) ;
  glut_setup() ;  
  gl_setup() ;
  glutMainLoop() ;

  return(0) ;
}
编辑2:我的主要功能如下所示:

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 ;
}
int main(int argc, char **argv) {
  glutInit( &argc, argv ) ;
  glut_setup() ;  
  gl_setup() ;
  glutMainLoop() ;

  return(0) ;
}
我有上面的设置
glut\u setup()
是我定义所有回调的地方:

 glutDisplayFunc( my_display );
 glutReshapeFunc( my_reshape ); 
 glutKeyboardFunc( my_keyboard );
 glutMouseFunc( my_mouse);
my_reforme
看起来如下所示,据我所知(这可能与事实相去甚远),每当调整窗口大小时,都会保持视口的大小不变,并使其相对居中:

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;
}

您的二维参数顺序错误。它应该是左、右、下、上,这将为您的程序生成正确的顺序gluOrtho2D(0780,0460)。您定义它的方式将宽度设为0,这很可能会导致一个错误,该错误不会将投影矩阵设置为默认值。参见此处的函数规范:。

当您在
GL\u projection
处离开矩阵模式时,您可能会用一些
glLoadIdentity()
调用或类似调用重置投影矩阵。但是到目前为止给出的代码还不能确定。你是对的@derhass,我已经添加了完整的函数来实际绘制。这仍然是不够的。在哪里调用
gl\u setup()
,以及在调用和进入主循环之间发生了什么?另外,其他回调可能会在此处产生干扰,如重塑函数。我添加了主函数,以便您可以看到调用
gl\u setup
的位置、我添加的回调以及重塑回调。如果你需要更多的信息,我很乐意提供