VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
OpenGL+Delphi
Третье измерение и тест глубины
:

Продолжаем знакомиться с OpenGL. В прошлой статье я познакомил тебя с инициализацией и двумя примитивами: точки и линии. Сегодня ты ещё немного узнаешь о примитивах и познакомишся с тестом глубины.

Загрузи проект из прошлой статьи и исправь процедуру FormPaint вот так (если у тебя нет исходников прошлого занятия, то возьми уже готовые здесь):

procedure TForm1.FormPaint(Sender: TObject);
var
 ps:TPaintStruct;
begin
 BeginPaint(Handle,ps);
 glClearColor(1,0.5,0.5,1);
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

 glRotated(45,1,0,0);

 glColor3f (0.0, 1.0, 0.0);
 glBegin(GL_QUAD_STRIP);
  glVertex3f(1.25,1.25,1);
  glVertex3f(1.25,-1.0,1);
  glVertex3f(-1,1.25,0);
  glVertex3f(-1,-1.0,0);
 glEnd;

 glColor3f (1.0, 1.0, 0.0);
 glBegin(GL_QUAD_STRIP);
  glVertex3f(1.0,1.0,0);
  glVertex3f(1.0,-1.25,0);
  glVertex3f(-1.25,1.0,1);
  glVertex3f(-1.25,-1.25,1);
 glEnd;

 glFlush();
 swapBuffers(dc);
 EndPaint(Handle,ps);
end;
Logo
Рис 1. Форма

Если ты запустишь сейчас программу, то увидишь нечто похожее на рисунок 1. Что же нового произошло? Во-первых это очистка экрана:

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

Я включил сюда очистку буфера глубины GL_DEPTH_BUFFER_BIT. Хотя глубину я ещё не использовал, но всё же сегодня я это сделаю.

Второе это glRotated(g,x,y,z). Эта функция поворачивает всю сцену на угол g, по осям x,y,z. В нашем случае сцена повернётся по оси X на 45 градусов. Если надо повернуть по оси y, то третий параметр нужно выставить в 1.

glBegin(GL_QUAD_STRIP);
  glVertex3f(1.0,1.0,0);
  glVertex3f(1.0,-1.25,0);
  glVertex3f(-1.25,1.0,1);
  glVertex3f(-1.25,-1.25,1);
 glEnd;

Эта конструкция рисует квадрат из четырёх точек. Так мы постепенно будем знакомиться со всеми возможными примитивами. В отличии от прошлой статьи, где я не использовал у вершин параметр Z, здесь я его использую. Поэтому наша сцена получилась трёхмерной.

Теперь ещё раз взгляни на результат работы программы, он немного не правильный. Два наших квадрата должны пересекаться в середине, но этого не происходит. Это связано с тем. Что не включён тест глубины. Для того, чтобы его включить, ты должен перед рисованием квадратов написать glEnable(GL_DEPTH_TEST). Подкорректируй свою программу (или мой исходник) вот так.

glEnable(GL_DEPTH_TEST);

 glColor3f (0.0, 1.0, 0.0);
 glBegin(GL_QUAD_STRIP);
  glVertex3f(1.25,1.25,1);
  glVertex3f(1.25,-1.0,1);
  glVertex3f(-1,1.25,0);
  glVertex3f(-1,-1.0,0);
 glEnd;

 glColor3f (1.0, 1.0, 0.0);
 glBegin(GL_QUAD_STRIP);
  glVertex3f(1.0,1.0,0);
  glVertex3f(1.0,-1.25,0);
  glVertex3f(-1.25,1.0,1);
  glVertex3f(-1.25,-1.25,1);
 glEnd;

 glDisable(GL_DEPTH_TEST);
Logo
Рис 1. Форма

Теперь у тебя получится правильная сцена, как на рисунке 2. Для того, чтобы регулировать функцией, отвечающей за тест глубины, ты можешь воспользоваться процедурой glDepthFunc. В качестве параметров ты можешь передавать следующие значения:

  • GL_NEVER - тест не выполнится никогда
  • GL_LESS - тест выполнится, если текущее значение Z меньше чем сохранённое.
  • GL_EQUAL - тест выполнится, если текущее значение Z равно сохранённому.
  • GL_LEQUAL - тест выполнится, если текущее значение Z меньше или равно сохранённому.
  • GL_GREATER - тест выполнится, если текущее значение Z больше сохранённого.
  • GL_NOTEQUAL- тест выполнится, если текущее значение Z не равен сохранённому.
  • GL_GEQUAL - тест выполнится, если текущее значение Z больше или равен сохранённому.
  • GL_ALWAYS - тест выполнится всегда.

    Эти функции ты можешь включать после включения теста глубины. Например:

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(glLess);
    

    Попробуй поиграть с этими функциями, а я удаляюсь. Увидимся в следующем номере.

     Исходники примера забирай здесь Заголовочные файлы возьми на моей страничке в разделе "Полезности".


Design by FMk group ©
Copyright©: Horrific aka Флёнов Михаил ©