В этом разделе рассмотрены команды, позволяющие фильтровать вывод вершин в буфер фрейма в зависимости от значения альфа-компоненты цвета.
Существует способ фильтровать вывод изображения на экран в зависимости от значения параметра 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 позволяет сохранить в стеке текущие установки альфа-теста.
Тест рубежного контроля
-
Как включить альфа-тест?
-
Какой метод определяет правило альфа-тестирования?
-
Какой смысл имеет аргумент GEQUAL метода AlphaFunc?
-
Как узнать текущее состояние активности альфа-тестирования?
-
Как узнать текущие значения аргументов метода AlphaFunc?
-
Как сохранить в стеке текущее состояние альфа-тестирования?
Далее читатель может
-
Посмотреть новый раздел авторской версии приложения, иллюстрирующего работу команд OpenGL.
-
Самостоятельно внести изменения в имеющийся проект, чтобы освоить работу описанных методов.
-
Продолжить создание авторской версии приложения, следуя его советам.
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] точка будет видна на панели.
Тест рубежного контроля
-
Что такое объектные координаты?
-
Каковы пределы изменения координат xo, yo, zo по умолчанию?
-
Что определяет координата w?
-
Что произойдет, если выбрать w = 0?
Верните вершину в центр панели. Меняйте размеры окна, сжимая и расширяя его в разных направлениях. Точка потеряет свое центральное положение и будет воспроизводиться в разных местах относительно границ панели в зависимости от ее размеров. Что это означает?
Достарыңызбен бөлісу: |