OpenGL - 如何绘制一个完整的窗口矩形

Posted

技术标签:

【中文标题】OpenGL - 如何绘制一个完整的窗口矩形【英文标题】:OpenGL - how to draw a full window rectangle 【发布时间】:2019-02-27 02:23:31 【问题描述】:

实际上,我想做的是显示与我创建的窗口大小相同的图像。但是我发现带有图像纹理的矩形会被稍微放大,以至于图像的边缘是不可见的。

因此我做了以下实验:对于我的窗口大小为 500x500,我首先用红色绘制一个大小为 500x500 的矩形,然后用黑色绘制第二个 (500-2) * (500-2) 的矩形。我得到的只是一个黑色的窗口。通过将代码中的d值增加到8,红线显示在左/右和底部,顶部显示直到d = 33。

我认为这是因为深度或投影,但我不知道如何解决它。有什么建议吗??

以下是我的示例代码:

#include <GL/glut.h> /* glut.h includes gl.h and glu.h*/

void rectangle(float x, float y, float x1, double y1, float r, float g, float b)

  glColor3f(r, g, b);
  glBegin(GL_QUADS);
  glVertex2f(x, y);
  glVertex2f(x, y1);
  glVertex2f(x1, y1);
  glVertex2f(x1, y);
  glEnd();


void display()

  /* clear window */
  glClear(GL_COLOR_BUFFER_BIT);

  int d = 33;

  // draw rectangle in red
  rectangle(d, d, 500 - d, 500 - d, 1, 0, 0);

  // draw rectangle in black
  rectangle(d + 1, d + 1, 500 - d - 1, 500 - d - 1, 0, 0, 0);

  /* flush GL buffers */
  glFlush();

void init()

  /* set clear color to black */
  glClearColor(0.0, 0.0, 0.0, 0.0);
  /* set fill color to white */

  /* set up standard orthogonal view with clipping */
  /* box as cube of side 2 centered at origin */
  /* This is default view and these statements could be removed */

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  gluOrtho2D(0, 500, 0, 500);


int main(int argc, char** argv)

  /* Initialize mode and open a window in upper left corner of
  /* screen */
  /* Window title is name of program (arg[0]) */
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  glutInitWindowSize(500, 500);
  glutInitWindowPosition(0, 0);
  glutCreateWindow("simple");
  glutDisplayFunc(display);
  init();
  glutMainLoop();

【问题讨论】:

您是否尝试禁用深度测试 glDisable(GL_DEPTH_TEST) 谢谢。但是在我的display()中添加了glDisable(GL_DEPTH_TEST)之后,问题依旧存在。 【参考方案1】:

我不确定这是否是过剩的错误,但我发现偏移值正好等于窗口边框的厚度。也就是说,对于左/右/下边缘,偏移量 = 9 像素,顶部的偏移量 = 32。

看起来虽然 glutInitWindowSize(500, 500) 将窗口的黑色区域初始化为 500x500,但它也假定包括边框在内的整个窗口大小为 500x500。然后当我绘制一个 500x500 的矩形时,它会拉伸矩形以适应创建窗口的轮廓,但不适合内部黑色区域。

我的解决方法是通过设置 gluOrtho2D 来投影一个具有 (-window_left, 500 + window_right, 0 - window_bottom, 500 + window_top) 的区域,但仍然在 (0, 0, 500, 500) 处绘制矩形:

gluOrtho2D(0 - 9, 500 + 9, 0 - 9, 500 + 40);  // 40 is an empirical value for showing the red rectangle completely

【讨论】:

以上是关于OpenGL - 如何绘制一个完整的窗口矩形的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/Glut 无法在其上绘制 [

如何在带有 Qt 的 OpenGL 中使用顶点缓冲区对象绘制矩形?

opengl:调整大小时如何将对象保留在窗口中

OpenGL:基本图形绘画二

OpenGL随机大小矩形代码更改绘制的矩形

OpenGL-坐标系