Ответы:
Они более дополняют друг друга, чем альтернативы. Вы почти всегда хотите установить прямоугольник ножниц на те же значения, что и в окне просмотра.
glViewport () определяет преобразование из нормализованного проекционного пространства в пространство экрана. Полигоны обрезаются до края проекционного пространства, но другие операции рисования, такие как glClear (), - нет. Таким образом, вы используете glViewport () для определения местоположения и размера области области просмотра экранного пространства, но растеризатор все еще может иногда визуализировать пиксели за пределами этой области.
Вот где появляется ножница. GlScissor () определяет прямоугольник экранного пространства, за которым ничего не рисуется (если включен тест ножниц).
Так, например, следующий код очистит весь экран, даже если область просмотра установлена на небольшую часть большего окна:
glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);
Добавление glScissor () и включение теста ножниц (который по умолчанию отключен) ограничивает очистку.
glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);
Иногда вы сталкиваетесь с реализацией, которая автоматически пересекает область просмотра, но нарушает спецификацию GL.
Кроме того, прямоугольник ножниц можно использовать для временного ограничения рисования суб-прямоугольником области просмотра, для специальных эффектов, элементов пользовательского интерфейса и т. Д.
Они работают в двух совершенно разных частях графического конвейера.
На самом деле glViewport определяет преобразование, и это преобразование происходит после вершинного шейдера, но до фрагментного шейдера. Если он помогает увидеть, где он концептуально вписывается, подумайте о том, что он является частью преобразований, которые используются для передачи ваших данных вершин из мирового пространства в экранное пространство (т.е. это относительно тесно связано с просмотром модели и проекцией).
Тест Scissor выполняется после фрагментного шейдера вместе со всеми другими операциями для каждого фрагмента, которые происходят в это время, такими как смешивание, глубина / трафарет и т. Д. Когда фрагмент тестируется с помощью теста Scissor, он, таким образом, уже прошел преобразование области просмотра.
Да, тест ножниц может быть быстрее трафарета, потому что это простой прием / отклонение на основе координат экранного пространства фрагмента, тогда как трафарет должен сравниваться с текущим значением в буфере трафарета, возможно увеличивать или уменьшать это текущее значение, также принимать во внимание результаты проверки глубины и т. д.
Итак, собрав все это вместе, вы сможете понять, почему существует тест на ножницы. Это дает вам возможность ограничить операции по фрагментам для прямоугольной части экрана, но без изменения текущего преобразования окна просмотра.
Мне нравятся такие вещи, которые объясняются визуально.
В OnpenGL у нас есть 2D-координаты, которые идут от -1 до +1 для оси X и Y.
Затем это изображение должно быть сопоставлено с координатами окна.
Давайте представим, что у нас есть окно, которое имеет темный цвет в качестве фона, и у нас есть белый как чистый цвет.
Наиболее распространенным случаем является отображение области просмотра и ножниц на весь экран.
Но мы можем установить для них меньшую область экрана.
Эти регионы могут быть разными. В следующем примере область просмотра покрывает весь экран, в то время как ножницы - это меньшая рамка.
И в этом последнем случае ножницы покрывают весь экран, в то время как область просмотра - меньшая коробка. Обратите внимание, что это glClear
влияет на весь экран, так как это определяется областью ножниц.
glScissors выполняет обрезку геометрии по части экрана.
Например, вы этого захотите, если бы вы визуализировали окно с графическим интерфейсом, в котором плавно прокручивался текст. Вы хотите обрезать всю геометрию за пределами части экрана, покрытой графическим интерфейсом, но сохранить частичный текст или многоугольники, которые все еще внутри.
glViewport отображает координаты проекции на координаты устройства, но не обрезает.
glStencil используется для маскировки отдельных пикселей в более сложных узорах, таких как неправильные формы. Таким образом, GlScissors быстрее.
glScissor более прост, чем проекционные преобразования с окном просмотра.
Тест glScissor указывает, какие пиксели необходимо изменить при рендеринге, а glViewport меняет способ отображения gl из координат устройства в координаты окна.
Тогда какая разница с установкой области просмотра к прямоугольнику, который вы хотите визуализировать, и настройкой матрицы проекции для отмены масштабирования, выполняемого областью просмотра.
Viewport
обрезает вычисления вершин. Если вы нарисуете линию с толщиной линии> 1 или точку сgl_PointSize
> 1, вы также начнете рисовать вне области просмотра.