Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

OpenGL

Можно ли одновременно с выводом изображения OpenGL в этом же окне рисовать напрямую в DC окна методами GDI: LineTo и т.п.)?

Конечно, только линии будут либо под gl картинкой, либо над. А от чего это зависит? Мне в идеале, наверное, нужно, чтобы они были поверх OpenGL.

Hужно рендерить картинку, а затем рисовать. А если под, то наоборот... Hо, как я уже говорил, это неэффективно. Лучше делать примерно так:

::glMatrixMode( GL_PROJECTION );
::glLoadIdentity();
::glMatrixMode( GL_MODELVIEW );
::glLoadIdentity();

::glColor3f( r, g, b );
::glBegin( GL_LINES );
  ::glVertex3f( x0, y0, -1.0f  );
  ::glVertex3f( x1, y1, -1.0f );
::glEnd();

Ваше окно - это квадрат с координатами от -1 до 1. Если в примере -1 заменить на 1, то все линии будут сзади, а так - они спереди...

В этом примере есть существенный недостаток. Он меняет матрицу PROJECTION. Если у MODELVIEW матрицы большой стек, то у PROJECTION это не так. Hо можно изменить этот пример следующим образом:

::glMatrixMode( GL_PROJECTION ); // Эту строчку можно как правило опустить.
// Поскольку программы обычно пишутся так, чтобы этот режим был всегда выбран

::glPushMatrix();
::glLoadIdentity();

::glColor3f( r, g, b );
::glBegin( GL_LINES );
  ::glVertex3f( x0, y0, z  );
  ::glVertex3f( x1, y1, z );
::glEnd();
::glPopMatrix();

Только в этом случае координаты окна не от -1 до один по каждой оси, а [xmin; xmax] и [ymin; ymax].

Если вы используете стандартные функции для определения проекции, а я бы рекомендовал именно так и делать, то

::glOrtho(
    left, right,
    top, bottom,
    znear, zfar
); 
xmin := left;
xmax := right;
ymin := top;
ymax := bottom;
z := znear, если хочется рисовать поверх
z := zfar, если хочется рисовать позади.

::glFrustum(
    left, right,
    top, bottom
    znear,
    zfar
);

xmin := left;
xmax := right;
ymin := top;
ymax := bottom;
z := znear, если хочется рисовать поверх
z := zfar, если хочется рисовать позади.
и
coeff = zfar / znear
xmin := left * coeff
xmax := right * coeff
ymin := top * coeff
ymax := bottom * coeff
z := zfat - это для рисования позади. 

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог