Шаг 24 - Треугольники и цвета

В этом шаге мы рассмотрим рисование треугольников и их закраску.

Давайте как обычно создадим проект, добавим к классу 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-х мерным координатам.

Шпаргалка

  1. Сделать стандартный проект
  2. Сделать 2 переменные, 2 пункта меню и 2 обработчика
  3. Обработать состояние переменных в функции OnDraw(...)

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin - 25.05.2000