Краткая теория
Команды OpenGL
GL.glvertex3d(…) 1) GL – имя класса в котором задаются команды OpenGL; 2) gl – к какой типизации относиться метод(gl, wgl, glu); 3) vertex – команда(представляет вершину); 4) 3 – количество аргументов в команде 5) Тип аргументов (d – double и т.п.) 6)Аргументы
Выключение освещения
При рисовании цветом нет необходимости вычислять для каждой точки на экране меру освещенности.
GL.glDisable(GL.GL_LIGHTING);
Команда glDisable выключает какой-либо атрибут. В данном случае подставляем константу освещения.
Вершины и примитивы
Вершина является атомарным графическим примитивом OpenGL и определяет точку, конец отрезка, угол многоугольника и т.д. Все остальные примитивы формируются с помощью задания вершин, входящих в данный примитив. Например, отрезок определяется двумя вершинами, являющимися концами отрезка.
С каждой вершиной ассоциируются ее атрибуты. В число основных атрибутов входят положение вершины в пространстве, цвет вершины и вектор нормали. Положение вершины в пространстве
Положение вершины определяются заданием ее координат в двух-, трех-, или четырехмерном пространстве (однородные координаты). Это реализуется с помощью нескольких вариантов команды glVertex*:void glVertex[2 3 4][s i f d] (type coords) void glVertex[2 3 4][s i f d]v (type *coords)
Каждая команда задает четыре координаты вершины: x, y, z, w. Команда glVertex2* получает значения x и y. Координата z в таком случае устанавливается по умолчанию равной 0, координата w – равной 1. Vertex3* получает координаты x, y, z и заносит в координату w значение 1. Vertex4* позволяет задать все четыре координаты.
Для ассоциации с вершинами цветов, нормалей и текстурных координат используются текущие значения соответствующих данных, что отвечает организации OpenGL как конечного автомата. Эти значения могут быть изменены в любой момент с помощью вызова соответствующих команд.
Операторные скобки glBegin / glEnd
Мы рассмотрели задание атрибутов одной вершины. Однако, чтобы задать атрибуты графического примитива, одних координат вершин недостаточно. Эти вершины надо объединить в одно целое, определив необходимые свойства. Для этого в OpenGL используются так называемые операторные скобки, являющиеся вызовами специальных команд OpenGL Определение примитива или последовательности примитивов происходит между вызовами командvoid glBegin (GLenum mode); void glEnd (void);
Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения:GL_POINTS каждая вершина задает координаты некоторой точки. GL_LINES каждая отдельная пара вершин определяет отрезок; если задано нечетное число вершин, то последняя вершина игнорируется. GL_LINE_STRIP каждая следующая вершина задает отрезок вместе с предыдущей. GL_LINE_LOOP отличие от предыдущего примитива только в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную. GL_TRIANGLES каждая отдельная тройка вершин определяет треугольник; если задано не кратное трем число вершин, то последние вершины игнорируются. GL_TRIANGLE_STRIP каждая следующая вершина задает треугольник вместе с двумя предыдущими. GL_TRIANGLE_FAN треугольники задаются первой и каждой следующей парой вершин (пары не пересекаются). GL_QUADS каждая отдельная четверка вершин определяет четырехугольник; если задано не кратное четырем число вершин, то последние вершины игнорируются. GL_QUAD_STRIP четырехугольник с номером n определяется вершинами с номерами 2n-1, 2n, 2n+2, 2n+1. GL_POLYGON последовательно задаются вершины выпуклого многоугольника.
Например, чтобы нарисовать треугольник с разными цветами в вершинах, достаточно написать:GLfloat BlueCol[3] = {0,0,1};
glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); /* красный */ glVertex3f(0.0, 0.0, 0.0); glColor3ub(0,255,0); /* зеленый */ glVertex3f(1.0, 0.0, 0.0); glColor3fv(BlueCol); /* синий */ glVertex3f(1.0, 1.0, 0.0); glEnd();
Как правило, разные типы примитивов имеют различную скорость визуализации на разных платформах. Для увеличения производительности предпочтительнее использовать примитивы, требующие меньшее количество информации для передачи на сервер, такие как GL_TRIANGLE_STRIP, GL_QUAD_STRIP, GL_TRIAGLE_FAN.
Рис. 1. Примитивы OpenGL Исходный код проекта:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.OpenGL;
namespace Furniture { public partial class Form1: Form { public Form1() { InitializeComponent(); }
private void openGLControl1_PrimaryPaint(object sender, EventArgs e) { GL.glDisable(GL.GL_LIGHTING);
GL.glBegin(GL.GL_TRIANGLES); GL.glColor3f(100.0f, 0.0f, 0.0f); /* красный */ GL.glVertex3f(0.0f, 0.0f, 0.0f); GL.glColor3ub(0, 255, 0); /* зеленый */ GL.glVertex3f(100.0f, 0.0f, 0.0f); GL.glColor3ub(100, 100, 0); GL.glVertex3f(100.0f, 100.0f, 0.0f); GL.glEnd();
GL.glEnd(); }
private void выходToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); }
private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("HELLO OpenGL!!!:)", "HELLO!!!"); } } }
Скриншот прокраммы:
Лабораторная работа № 2
|