Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGL中,如何制作简单的背景四边形?_Opengl_Graphics_Image_Background_Glut - Fatal编程技术网

在OpenGL中,如何制作简单的背景四边形?

在OpenGL中,如何制作简单的背景四边形?,opengl,graphics,image,background,glut,Opengl,Graphics,Image,Background,Glut,假设我想画一个简单的四边形,如下所示: glBegin(GL_QUADS); glVertex2f(-1.0,-1.0); glVertex2f(1.0,-1.0); glVertex2f(1.0, 1.0); glVertex2f(-1.0, 1.0); glEnd(); 有没有办法画出这样的画面,它会出现在所有3D对象的后面,并填满整个屏幕?我的相机随着鼠标移动,所以这个四边形也必须在相机移动时保持静止。目的是制作一个简单的背景 我是否必须根据眼睛的位置/旋转进行一些疯狂的变换,或者是否有

假设我想画一个简单的四边形,如下所示:

glBegin(GL_QUADS);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();
有没有办法画出这样的画面,它会出现在所有3D对象的后面,并填满整个屏幕?我的相机随着鼠标移动,所以这个四边形也必须在相机移动时保持静止。目的是制作一个简单的背景


我是否必须根据眼睛的位置/旋转进行一些疯狂的变换,或者是否有一种更简单的方法使用glMatrixMode()?

你能不能把它放在背景中,如果你想把它放在你的周围,就把你自己放进去。您需要先绘制它,使其位于所有对象后面。

以下是我将用于每个帧的步骤:

  • 使用
    glClear(GL\u depth\u buffer\u位)清除深度缓冲区
  • 使用
    glDisable(GL\u depth\u TEST)关闭深度测试
  • 使用
    gluOrtho2D(-1.0,1.0,-1.0,1.0)在固定正交投影中加载
  • 按照描述绘制四边形
  • 重新启用深度测试
  • 加载常规透视投影并绘制视图的其余部分

  • 听起来你想要做的和在一个简单的游戏中画一个2D HUD的时候类似,或者只是一个持久的背景。我不是专家,但我只是最近才做的。您要做的是将投影矩阵更改为正交投影,渲染四边形,然后切换回以前的任何投影。您可以使用矩阵堆栈执行此操作,它完全独立于任何摄影机

    因此,首先:

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    int w = glutGet(GLUT_WINDOW_WIDTH);
    int h = glutGet(GLUT_WINDOW_HEIGHT);
    gluOrtho2D(0, w, h, 0);
    
    这会将一个新的投影矩阵推到投影堆栈上(我在这个项目中使用glut,但它应该转换为普通的OpenGL)。然后,我得到窗口的宽度和高度,并使用gluOrtho2D设置正交投影

    下一步:

    在这里,我只是将一个新的、干净的矩阵推到modelview上。您可能不需要这样做

    最后:

    glPopMatrix() // Pops the matrix that we used to draw the quad
    glMatrixMode(GL_PROJECTION);
    glPopMatrix(); // Pops our orthographic projection matrix, which restores the old one
    glMatrixMode(GL_MODELVIEW); // Puts us back into GL_MODELVIEW since this is probably what you want
    
    我希望这有帮助。可以看出,它不需要使用眼睛的位置。这主要是因为当我们使用一个新的正交投影,完全适合我们的窗口,这是无关的。但是,如果在其他draw调用之后执行此操作,则可能不会将四边形放在后面


    编辑:关闭深度测试并清除深度缓冲区也会有所帮助,正如Boojum所建议的那样。

    正是我刚才试图用英语表述的:)最后一个重要步骤是在最后一行之前,添加以下内容:glMatrixMode(GL_投影);glLoadIdentity();gluPerspective(/*您的perspective变量*/);如果没有,3D模型会变得很奇怪。@jubei在现代OpenGL中你会怎么做?缺少教程。@JeanNassar对于堆栈溢出评论来说,答案太长了。我建议你开始一个新问题!
    glPopMatrix() // Pops the matrix that we used to draw the quad
    glMatrixMode(GL_PROJECTION);
    glPopMatrix(); // Pops our orthographic projection matrix, which restores the old one
    glMatrixMode(GL_MODELVIEW); // Puts us back into GL_MODELVIEW since this is probably what you want