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


Альфа-тест. Метод AlphaFunc



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

2 Альфа-тест. Метод AlphaFunc


В этом разделе рассмотрены команды, позволяющие фильтровать вывод вершин в буфер фрейма в зависимости от значения альфа-компоненты цвета.
Существует способ фильтровать вывод изображения на экран в зависимости от значения параметра alpha метода Color. Это так называемый альфа-тест.

Для определения условий альфа-теста используется метод AlphaFunc, задающий функцию тестирования.

///

/// Определяет способ тестирования по параметру альфа.

/// Тот или иной способ позволяет фильтровать изображение вершин в зависимости

/// от значения альфа-компоненты цвета.

///

///

/// Определяет функцию сравнения при использовании альфа-тестирования.

/// Принимаются символьные постоянные NEVER, LESS, EQUAL, LEQUAL,

/// GREATER, NOTEQUAL, GEQUAL и ALWAYS.

/// По умолчанию условие альфа-тестирования установлено в ALWAYS,

/// то есть никакой фильтрации изображения по параметру альфа не происходит.

///

///

/// Задает значение параметра альфа, с которым сравнивается другое значение альфа,

/// поступающее в буфер вместе с изображением, например, является параметром метода Color.

/// Значение параметра сжимается в интервал [0; 1]. Значение по умолчанию равно 0.

///

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

public static extern void AlphaFunc(int function, float referenceValue);

Использование этого метода требует наличие констант

// Символьные постоянные, используемые в определении функции альфа-тестирования

public const int NEVER = 0x0200;

public const int LESS = 0x0201;

public const int EQUAL = 0x0202;

public const int LEQUAL = 0x0203;

public const int GREATER = 0x0204;

public const int NOTEQUAL = 0x0205;

public const int GEQUAL = 0x0206;

public const int ALWAYS = 0x0207;

После задания условий альфа-тестирования необходимо активировать сам процесс тестирования методом Enable с параметром ALPHA_TEST.

///

/// Параметр активации и дезактивации альфа-теста

///

public const int ALPHA_TEST = 0x0BC0;

Приведенные описания следует поместить в класс gl библиотеки GL.
К примеру, измените код в случае "One point" метода BuildFrame() класса f3D с тем, чтобы увидеть эффект альфа-тестирования

case "One point":

gl.PointSize(10);

// Задается правило тестирования: alpha должно быть меньше 0.2.

gl.AlphaFunc(gl.LESS, .2f);

// Активируется альфа-тестирование

gl.Enable(gl.ALPHA_TEST);

gl.Color(1, 0, 0, .1f);

// Точка изображается, т.к. альфа-компонента цвета 0.1 меньше, чем заданное выше значение 0.2

gl.Begin(gl.POINTS);

gl.Vertex(0, 0);

gl.End();

break;

Измените в этом коде условие тестирования. Например, замените gl.LESS на gl.GREATER, или 0.2 на 0.05. В обоих случаях точка не будет изображаться, т.к. условия теста не будут соблюдаться.


Для определения состояния включения альфа-теста можно использовать метод IsEnabled с тем же параметром ALPHA_TEST, либо метод Get. Для определения текущего значения параметров метода AlphaFunc используется метода Get в форме

(int)gl.Get(gl.ALPHA_TEST_FUNC, 1)[0]

gl.Get(gl.ALPHA_TEST_REF, 1)[0]

Константы, используемые здесь, имеют вид

///

/// Аргумент Get требует возврата значения одного параметра - целочисленной постоянной,

/// определяющей функцию альфа-теста.

///

public const int ALPHA_TEST_FUNC = 0x0BC1;

///

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

/// текущего значения параметра referenceValue метода AlphaFunc.

///

public const int ALPHA_TEST_REF = 0x0BC2;

Метод PushAttrib с параметром COLOR_BUFFER_BIT позволяет сохранить в стеке текущие установки альфа-теста.
Тест рубежного контроля


  1. Как включить альфа-тест?

  2. Какой метод определяет правило альфа-тестирования?

  3. Какой смысл имеет аргумент GEQUAL метода AlphaFunc?

  4. Как узнать текущее состояние активности альфа-тестирования?

  5. Как узнать текущие значения аргументов метода AlphaFunc?

  6. Как сохранить в стеке текущее состояние альфа-тестирования?

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



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

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

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



3 Объектные координаты вершин


В этом разделе будут меняться координаты точки. К чему это приведет? Что такое объектные координаты? Что означает 4-ая координата вершины?
До сих пор аргументами метода Vertex были 0,0. Это значения xo и yoтак называемых объектных координат (их еще называют мировыми координатами). Аргументами функции Vertex являются объектные координаты вершины. Точка изображалась в центре панели. Если изменить значение xo = 1, то точка окажется справа на краю панели, значение yo = 1 перенесет точку на верхнюю границу. Внесите эти изменения в свой проект и проверьте, либо войдите в авторский проект и проводите изменения координат вершины с помощью управляющих элементов левой панели. Код данной сцены авторского проекта здесь.

У вершины может быть 4-ая координата (третья координата z пока будет равна нулю). Вызовите метод Vertex в версиях с четырьмя координатами Vertex(2,0,0,2), Vertex(0,2,0,2). Убедитесь, что в этих случаях точка будет изображена на правой и верхней границе панели. Дело в том, что на конечном этапе определения места положения точки в окне, значения координат x, y, z делятся на координату w, или, как говорят, нормализуются. Отсюда должна быть понятна роль 4-ой координаты w. Эта координата (по умолчанию равная 1) используется для указания масштаба объектных координат.

В приведенных примерах третья координата z, определяющая глубину изображения, была равна нулю. Если метод Vertex вызывается с двумя параметрами, то z = 0 по умолчанию. Придайте z любое значение, отличное от нуля. Убедитесь, что пока значение z лежит в интервале [–w;w] точка будет видна на панели.
Тест рубежного контроля


  1. Что такое объектные координаты?

  2. Каковы пределы изменения координат xo, yo, zo по умолчанию?

  3. Что определяет координата w?

  4. Что произойдет, если выбрать w = 0?

Верните вершину в центр панели. Меняйте размеры окна, сжимая и расширяя его в разных направлениях. Точка потеряет свое центральное положение и будет воспроизводиться в разных местах относительно границ панели в зависимости от ее размеров. Что это означает?




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




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

    Басты бет