Я настоятельно рекомендую вам взглянуть на некоторые учебные пособия по OpenGL (http://nehe.gamedev.net/ - хороший сайт, он расскажет вам все, что вам нужно знать), но при условии, что в вашем коде правильно настроен OpenGL,вы бы сделали что-то подобное в своей функции DrawRectWithOpenGL (я не программист на C ++, но я думаю, что мой код выглядит правильно для C ++):
void DrawRectWithOpenGL(RECT* pRect)
{
glPushMatrix(); //Make sure our transformations don't affect any other transformations in other code
glTranslatef(pRect->x, pRect->y, 0.0f); //Translate rectangle to its assigned x and y position
//Put other transformations here
glBegin(GL_QUADS); //We want to draw a quad, i.e. shape with four sides
glColor3f(1, 0, 0); //Set the colour to red
glVertex2f(0, 0); //Draw the four corners of the rectangle
glVertex2f(0, pRect->h);
glVertex2f(pRect->w, pRect->h);
glVertex2f(pRect->w, 0);
glEnd();
glPopMatrix();
}
OpenGL не имеет API для 2D-рисования, но еголегко делать 2D-вещи, просто игнорируя ось Z (или просто используя ось Z, чтобы удостовериться, что спрайты нарисованы на правильной глубине, то есть вы можете нарисовать фон после переднего плана, потому что глубина фона установлена так, что он находится позадина переднем плане).Надеюсь это поможет.Определенно найдите время, чтобы взглянуть на некоторые учебные пособия, и все станет ясно.
РЕДАКТИРОВАТЬ : для настройки OpenGL для 2D-чертежа необходимо настроить ортографическую проекцию (учебные пособия, которыеЯ связан с использует перспективную проекцию, извините, что не упомянул это).Вот пример некоторого моего кода, который делает это (который должен быть где-то в вашей функции InitOpenGL, после того, как вы создали свое окно):
glClearColor(0.0, 0.0, 0.0, 0.0); //Set the cleared screen colour to black
glViewport(0, 0, screenwidth, screenheight); //This sets up the viewport so that the coordinates (0, 0) are at the top left of the window
//Set up the orthographic projection so that coordinates (0, 0) are in the top left
//and the minimum and maximum depth is -10 and 10. To enable depth just put in
//glEnable(GL_DEPTH_TEST)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, screenwidth, screenheight, 0, -10, 10);
//Back to the modelview so we can draw stuff
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Clear the screen and depth buffer
Итак, это отсортированная инициализация.Вы должны иметь возможность использовать такие значения, как 100 и 200, чтобы они правильно отображались на экране, т. Е. Координаты указаны в пикселях.
Для обработки изменений размера окна вам нужно будет найти размер окна.(с использованием внешней библиотеки. Я не уверен, что вы можете сделать это в OpenGL, хотя glutGet (GLUT_WINDOW_WIDTH) и glutGet (GLUT_WINDOW_HEIGHT) из GLUT могут работать, но я не проверял это), а затем снова вызывать glViewport и glOrtho собновленный размер окна.
Опять же, вам придется использовать внешнюю библиотеку, чтобы точно узнать , когда размер окна изменится.Я не уверен, что вы могли бы использовать, хотя, если вы используете SDL, то для этого может потребоваться некоторая обработка событий (и может быть возможность вернуть ширину и высоту экрана, если glutGet не работает).
Надеюсь, это поможет!