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 - это для рисования позади.
