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