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

#iphone #ios #opengl-es

#iPhone #iOS #opengl-es

Вопрос:

На старых устройствах iOS буфер трафарета недоступен. Также scissor работает только для простых прямоугольников. Можем ли мы использовать буфер глубины для более общего отсечения? Чтобы упростить задачу, давайте предположим, что мы рисуем только в 2D.

Кроме того, мое конкретное требование — иметь возможность поворачивать прямоугольник обрезки.

Ответ №1:

Да, абсолютно. Например. (кодируется по мере ввода):

 glEnable(GL_DEPTH_TEST); // to enable writing to the depth buffer
glDepthFunc(GL_ALWAYS);  // to ensure everything you draw passes
glDepthMask(GL_TRUE);    // to allow writes to the depth buffer
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
                         // so that whatever we draw isn't actually visible

glClear(GL_DEPTH_BUFFER_BIT); // for a fresh start

/* here: draw geometry to clip to the inside of, e.g. at z = -2 */

glDepthFunc(GL_GREATER); // so that the z test will actually be applied
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
                         // so that pixels are painted again...
glDepthMask(GL_FALSE);  // ... but don't change the clip area

/* here: draw the geometry to clip inside the old shape at a z further than -2 */
  

Итак, ключевыми функциями являются:

  • проверка глубины может быть настроена всегда на прохождение
  • цветопередача может быть отключена, даже если установлены другие значения буфера

Комментарии:

1. Не нужно ли нам также выполнить glDepthMask (GL_FALSE) после выполнения glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)? Чтобы значения буфера глубины области обрезки не менялись?

2. О, да, это имело бы смысл. По какой-то причине я думал о том, чтобы (i) задать соответствующую область обрезки; (ii) нарисовать объект; (iii) повторить. Это была глупая дополнительная специализация, которую можно было себе представить. Я исправлю свой ответ.

3. @Tommy Как насчет произвольного объема для отсечения с четырьмя сторонами. Меня интересует повернутый и переведенный параллелепипед?