В этом шаге мы рассмотрим рисование треугольников и их закраску.
Давайте как обычно создадим проект, добавим к классу C...View две переменные m_iMode и m_iFlat. В конструкторе класса проинициализируем их.
Добавим в меню View два новых подменю Triangle Color Mode и Triangle Shade Mode c соответствующими идентификаторами.
Напишем функции-обработчики этих меню:
void CExampleView::OnTriagColorMode() { // TODO: Add your command handler code here if(m_iMode==1) m_iMode = 0; else m_iMode = 1; InvalidateRect(NULL, FALSE); } void CExampleView::OnTriagShadeMode() { // TODO: Add your command handler code here if(m_iFlat==1) m_iFlat = 0; else m_iFlat = 1; InvalidateRect(NULL, FALSE); }
Логика действия очевидна, описывать не буду.
Теперь рассмотрим самую главную для нас функцию - OnDraw(...):
void CExampleView::OnDraw(CDC* pDC) { CRect clientRect; CExampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here GetClientRect(&clientRect); glViewport(0, 0, clientRect.right, clientRect.bottom); glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета glLineWidth (20); // размер точек glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов switch(m_iFlat) { case 0: glShadeModel(GL_FLAT); break; case 1: glShadeModel(GL_SMOOTH); break; } switch(m_iMode) { case 0: glBegin (GL_TRIANGLES); glVertex2f(0,0.5); glVertex2f(0.5,-0.5); glVertex2f(-0.5,-0.5); glEnd(); break; case 1: glBegin (GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0,0.5); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.5,-0.5); glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.5,-0.5); glEnd(); break; } }
Попереключайте меню в разных комбинациях.
Наиболее интересная позиция - режим GL_FLAT + многоцветный треугольник. Результат на первый взгляд странный - треугольник синий.
Но если посмотреть внимательно, то последняя окрашиваемая вершина треугольника синяя.
Более того, если вы нарисуете несколько треугольников в режиме STRIP или FAN (их мы рассмотрим в следующем шаге), то все они будут нарисованы цветом последнего из них. Этот момент станет более понятным после того, как мы перейдем к 3-х мерным координатам.