OpenGL - как нарисовать прямоугольник полного окна - PullRequest
0 голосов
/ 27 февраля 2019

На самом деле я хочу показать изображение идентичного размера с окном, которое я создал.Но я обнаружил, что прямоугольник с текстурой изображения будет немного увеличен, так что край изображения будет невидимым.

Таким образом, я провел следующий эксперимент: Для моего размера окна 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();
}

1 Ответ

0 голосов
/ 04 марта 2019

Я не уверен, является ли это ошибкой перенасыщения или нет, но я обнаружил, что значения смещения просто равны толщине границы окна.То есть для левого / правого / нижнего краев смещение = 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
...