Библиотека трехмерной графики Open gl



бет5/15
Дата29.05.2016
өлшемі1.07 Mb.
#100718
1   2   3   4   5   6   7   8   9   ...   15

1 Атрибуты точки


По умолчанию примитив точка изображается в форме белого квадрата со стороной в один пиксель. В OpenGL существует возможность менять размеры, форму и цвет точки. В этом разделе будут описаны методы, которые

  • Управляют размерами точки

  • Определяют внешний вид точки

  • Позволяют сохранить предыдущие установки атрибутов, изменив их на время выполнения отдельных действий.

  • Определяют цвет вершины

  • Позволяют регулировать вывод компонент цвета на экран

Метод PointSize


Обычно, по умолчанию, размер точки равен единице.

Метод void PointSize(float size) позволяет задавать диаметр size растра изображаемой точки. Вот его описание, которое следует поместить в класс gl библиотеки GL

///

/// Определяет диаметр растра изображаемой точки.

///

///

/// Диаметр от некоторого минимального до некоторого максимального значения.

/// По умолчанию диаметр обычно равен 1.

///

[DllImport("OPENGL32.DLL", EntryPoint = "glPointSize")]

public static extern void PointSize(float size);

Вызов метода PointSize внутри скобок Begin/End приведет к ошибке.

Для примера использования метода PointSize поместите его вызов внутрь метода BuildeFrame() формы f3D , в случай "One point" так, чтобы новая версия кода в этом случае выглядела следующим образом

case "One point": //0

gl.PointSize(10);

gl.Begin(gl.POINTS);

gl.Vertex(0, 0);

gl.End();

break;

Точка должна выглядеть как большой квадрат.



Измените значения параметра 10, выбираемого для PointSize. Посмотрите результат.
Текущее значение диаметра size может быть определено вызовом метода Get в форме

gl.Get(gl.POINT_SIZE, 1)[0], где в качестве первого аргумента используется константа

///

/// Аргумент Get требует возврата значения одного параметра - размера точки

///

public const int POINT_SIZE = 0x0B11;

Размер точки может меняться в определенных пределах, определяемых методом Get в форме


  • Для получения минимального размера точки

gl.Get(gl.POINT_SIZE_RANGE, 2)[0]

  • Для получения максимального размера точки

gl.Get(gl.POINT_SIZE_RANGE, 2)[1]

Видимый размер точки меняется с определенным шагом (granularity), который возвращается функцией gl.Get(gl.POINT_SIZE_GRANULARITY, 1)[0].

Постоянные, с которыми вызываются эти функции

///

/// Аргумент Get требует возврата значения двух параметров -

/// минимального и максимально возможного размеров точки.

///

public const int POINT_SIZE_RANGE = 0x0B12;

///

/// Аргумент Get требует возврата значения одного параметра –

/// различия в значениях размеров точки,

/// которые учитываются в изображении.

///

public const int POINT_SIZE_GRANULARITY = 0x0B13;


Сглаживание. Методы Enable, Disable и IsEnable


Другим атрибутом изображения точки является сглаживание ("smooth" antialiasing mechanism). При включенном сглаживании точка изображается не квадратом, а кругом, размеры которого по-прежнему определяются методом PointSize.

Включение сглаживания (как и многих других параметров в OpenGL) выполняется с помощью метода

///

/// Активирует режимы формирования изображения командами OpenGL

///

///

/// Символьная постоянная, указывающая активируемый режим.

///

[DllImport("OPENGL32.DLL", EntryPoint = "glEnable")]

public static extern void Enable(int capability);

а отключение - его антиподом

///

/// Дезактивирует режимы формирования изображения командами OpenGL

///

///

/// Символьная константа, указывающая дезактивируемый режим.

///

[DllImport("OPENGL32.DLL", EntryPoint = "glDisable")]

public static extern void Disable(int capability);

Конкретно, для включения эффекта сглаживания следует использовать метод Enable с аргументом, определенным константой

///

/// Параметр сглаживания изображения точки.

/// Используется методами Get, Enable, Disable и IsEnable.

///

public const int POINT_SMOOTH = 0x0B10;

Для отключения сглаживания используется метод Disable с тем же аргументом.

Поместите приведенные описания методов Enable, Disable и постоянной POINT_SMOOTH в класс gl библиотеки GL.

В методе BuildeFrame() формы f3D, в том же случае "One point" измените код, чтобы проверить действие эффекта сглаживания

case "One point": //0

gl.PointSize(10);

gl.Enable(gl.POINT_SMOOTH);

gl.Begin(gl.POINTS);

gl.Vertex(0, 0);

gl.End();

break;

Точка должна приобрести вид круга.



Для определения, включено ли сглаживание, можно использовать метод Get с тем же аргументом в форме gl.Get(gl.POINT_SMOOTH, 1)[0] != 0, либо метод (который следует добавить в класс gl библиотеки GL)

///

/// Определяет, активирован ли режим

///

///

/// Символьная постоянная, указывающая дезактивируемый режим.

///

///

/// true или false, в зависимости от результатов проверки

///

[DllImport("OPENGL32.DLL", EntryPoint = "glIsEnabled")]

public static extern bool IsEnabled(int capability);

с тем же аргументом POINT_SMOOTH.

Методы PushAttrib, PopAttrib


OpenGL имеет практичный способ сохранять нетронутыми ранее установленные атрибуты при их временном изменении.

Все атрибуты, регулирующие свойства изображения, формируемые командами OpenGL, и активность многих функций этой библиотеки, содержатся в специальном стеке памяти. Если необходимо временно изменить часть атрибутов, как, например, размер точки, можно создать копию прежних значений, "затолкнув" их в стек (push). В образовавшейся копии наверху стека можно менять атрибуты, строя новые образы. После окончания создания новых образов, измененные атрибуты, в которых больше нет необходимости, можно вытолкнуть (pop) из стека. На их место вернется сохраненная копия прежних атрибутов.

Для работы механизма сохранения и восстановления атрибутов существуют методы

///

/// Заталкивает в стек копию атрибутов, определяемых аргументом mask.

///

///

/// Символьная константа, определяющая атрибуты, копируемые в стек.

///

[DllImport("OPENGL32.DLL", EntryPoint = "glPushAttrib")]

public static extern void PushAttrib(int mask);

///

/// Восстанавливает сохраненную копию атрибутов из стека.

///

[DllImport("OPENGL32.DLL", EntryPoint = "glPopAttrib")]

public static extern void PopAttrib();

В частности, аргументом метода PushAttrib при работе с такими атрибутами точки как размеры и сглаживание должна быть константа

///

/// Маска атрибутов точки.

///

public const int POINT_BIT = 0x00000002;

Поместите описания методов PushAttrib, PopAttrib и постоянной POINT_BIT в класс gl библиотеки GL.

Проверьте их работу, изменив код случая "One point" метода BuildFrame() в форме f3D. Например, замените прежний код новым кодом вида

case "One point": //0

gl.PointSize(10);

gl.Enable(gl.POINT_SMOOTH);

gl.Begin(gl.POINTS);

gl.Vertex(0, 0);

gl.End();

// Заталкиваем в стек установленный размер точки и включенный эффект сглаживания

gl.PushAttrib(gl.POINT_BIT);

// Строим точку, сдвинутую вправо по оси x,

// с новым размером (5) и без эффекта сглаживания

gl.PointSize(5);

gl.Disable(gl.POINT_SMOOTH);

gl.Begin(gl.POINTS);

gl.Vertex(.5f, 0);

gl.End();

// Выталкиваем из стека временно установленные атрибуты точки,

// возвращаясь к прежним атрибутам

gl.PopAttrib();

// Изображаем точку, сдвинуту влево по оси x,

// с прежними атрибутами: размер 10, есть эффект сглаживания

gl.Begin(gl.POINTS);

gl.Vertex(-.5f, 0);

gl.End();

break;

В результате на экране должны появиться три точки – в центре размером 10 и в форме круга, справа размером 5 и в форме квадрата, и, наконец, слева опять размером 10 в форме круга.


Цвет вершины. Метод Color


Цвет точки по умолчанию белый. Его можно сделать произвольным с помощью команд Color библиотеки OpenGL. Так выглядит описание методов Color

///

/// Устанавливает текущий цвет. Может иметь три или 4 параметра типа float.

/// Первые три параметра определяют интенсивности красного, зеленого и синего цветов

/// и лежат в интервале от 0 (нулевая интенсивность) до 1 (полная интенсивность).

/// Четвертый параметр определяет интенсивность альфа-компоненты,

/// или "компоненты прозрачности" в тех же пределах.

/// Если альфа-компонента не задается, то ее значение равно 1 (полная интенсивность).

///

[DllImport("OPENGL32.DLL", EntryPoint = "glColor3f")]

public static extern void Color(float red, float green, float blue);

[DllImport("OPENGL32.DLL", EntryPoint = "glColor4f")]

public static extern void Color(float red, float green, float blue, float alpha);

Каждая вершина может иметь свой цвет, если предварить вызов метода Vertex вызовом метода Color.

Поместите эти методы в класс gl библиотеки GL.

Для проверки работы метода Color внесите изменение в код случая "One point" в методе BuildFrame() класса f3D. Например, напишите этот случай в виде

case "One point": //0

gl.PointSize(10);

gl.Enable(gl.POINT_SMOOTH);

gl.Begin(gl.POINTS);

gl.Color(1, 0, 0);

gl.Vertex(0, 0);

gl.End();

break;


В центре должна появиться круглая красная точка.
Узнать текущий цвет можно с помощью метода Get, вызванного в форме

gl.Get(gl.CURRENT_COLOR, 4)[i].

Здесь значения i = 0, 1, 2, 3 соответствуют красной, зеленой, синей и альфа-компоненте цвета.

Константа CURRENT_COLOR имеет вид

public const int CURRENT_COLOR = 0x0B00;

При использовании метода PushAttrib для сохранения предыдущего цвета следует использовать аргумент

///

/// Маска атрибутов цвета

///

public const int CURRENT_BIT = 0x00000001;

Поместите описание этой постоянной в класс gl библиотеки GL.

По аналогии с примером из предыдущего раздела постройте три точки красного и зеленого цветов, используя метод PushAttrib с параметром CURRENT_BIT и метод PopAttrib().



Фильтр цвета. Метод ColorMask


В библиотеке OpenGL существует метод ColorMask, маскирующий вывод на экран произвольной компоненты цвета.

Добавьте к разделу "Очистка буферов" класса gl библиотеки GL описание

///

/// Маскирует воспроизведение компонент цвета red, green, blue и alpha.

/// По умолчанию значения всех параметров true.

///Значение false маскирует соответствующую компоненту.

///

[DllImport("OPENGL32.DLL", EntryPoint = "glColorMask")]

public static extern void ColorMask(bool red, bool green, bool blue, bool alpha);

В качестве примера использования метода ColorMask в методе BuildFrame() класса формы f3D случай "One point" запишите в виде

case "One point":

gl.PointSize(10);

gl.Enable(gl.POINT_SMOOTH);

gl.ColorMask(false, true, true, true);

// цвет белый

gl.Color(1, 1, 1);

// маскировка красного делает белую точку бирюзовой

gl.Begin(gl.POINTS);

gl.Vertex(0, 0);

gl.End();

break;

Убедитесь, меняя параметры ColorMask, что маскировка убирает любую из цветовых компонент. Точка в центре панели будет изображена бирюзовым кругом, т.к. из ее белого цвета будет убрана красная составляющая.



Для определения текущего состояния ColorMask используется метод Get в форме

gl.Get(gl.COLOR_WRITEMASK, 4)[i] != 0

Константа COLOR_WRITEMASK имеет вид

public const int COLOR_WRITEMASK = 0x0C23;

При использовании PushAttrib для изменения ColorMask аргументом должна быть константа COLOR_BUFFER_BIT, уже описанная в классе gl библиотеки GL.
Тест рубежного контроля


  1. Какой метод регулирует размер точек?

  2. Как определить пределы возможных значений размеров точки?

  3. Как определить шаг изменения размеров точки?

  4. Какой метод "включает" сглаживание?

  5. Какая постоянная должна быть аргументом метода, включающего сглаживание?

  6. Что делает метод Disable?

  7. Какой метод определяет активность данного состояния OpenGL?

  8. Какой метод сохраняет текущие атрибуты в стеке?

  9. Какой аргумент используется при сохранении в стеке атрибутов точки?

  10. Что делает метод PopAttrib?

  11. Что делает метод Color?

  12. Какие версии метода Color используются в проекте?

  13. Как определить текущий цвет?

  14. Как сохранить в стеке текущий цвет?

  15. Какой метод используется для фильтрации цвета?

  16. Как узнать текущие значения аргументов метода фильтрации цвета?

  17. Как сохранить атрибуты метода ColorMask в стеке?

Далее читатель может



  1. Посмотреть новый раздел авторской версии приложения, иллюстрирующего работу команд OpenGL.

  2. Самостоятельно внести изменения в имеющийся проект, чтобы освоить работу описанных методов.

  3. Приступить к созданию авторской версии приложения.

В следующем разделе приводятся команды OpenGL, использующие значения 4-ой "невидимой" компоненты цвета – альфа-компоненты.




Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   ...   15




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет