Відповіді:
Вони більше доповнюють один одного, ніж альтернативи. Ви майже завжди хочете встановити прямокутник ножиць на ті самі значення, що й у вікні перегляду.
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 насправді визначає перетворення, і це перетворення відбувається після вершинного шейдера, але перед фрагментом шейдера. Якщо це допомагає побачити, куди вона концептуально вписується, подумайте з точки зору того, що воно є частиною перетворень, які використовуються для отримання ваших вершинних даних із світового простору в екранний простір (тобто це відносно тісно пов'язане з переглядом моделі та проекцією).
Тест на ножиці відбувається після шейдера фрагмента разом з усіма іншими операціями з фрагментами, які відбуваються в той час, такими як змішування, глибина / трафарет і т. Д. Коли фрагмент тестується тестом ножиць, він уже пройшов перетворення зору перегляду.
Так, тест ножиць може бути швидшим, може бути трафаретом, оскільки це просте прийняття / відхилення на основі фрагментів простору екрана фрагмента, тоді як трафарет потрібно порівнювати з поточним значенням у буфері трафарету, можливо, збільшенням або зменшенням поточного значення, також враховувати результати глибинного випробування тощо.
Таким чином, склавши все це разом, ви можете зрозуміти, чому існує тест на ножиці. Це дає вам можливість обмежувати операції з фрагментами на прямокутну частину екрана, але фактично не змінюючи поточне перетворення вікна перегляду.
Мені подобається, що такі речі пояснюються візуально.
У OnpenGL у нас є 2D координати, які йдуть від -1 до +1 як для осі X, так і для Y.
Потім це зображення потрібно зіставити на координати вікон.
Давайте уявимо, що у нас є вікно, яке має темний колір, як задній грунт, і у нас білий як прозорий колір.
Найпоширеніший випадок, коли вікно перегляду та ножиці охоплюють весь екран.
Але ми можемо встановити їх як меншу область екрану.
Ці регіони можуть бути різними. У наступному прикладі вікно перегляду охоплює весь екран, в той час як ножиця - це менша скринька.
І в цьому останньому випадку ножиця охоплює весь екран, тоді як вікно огляду - менша скринька. Зверніть увагу, що glClear
впливає на весь екран, оскільки це визначається областю ножиць.
glScissors здійснює відсікання геометрії щодо частини екрану.
Цього хотілося б, наприклад, якби ви надавали вікно графічного інтерфейсу, в якому плавно прокручувався текст всередині нього. Ви хочете вирізати всю геометрію за межами частини екрану, охопленої графічним інтерфейсом, але зберегти частковий текст або багатокутники, які все ще знаходяться всередині.
glViewport позначає координати проекції на координати пристрою, але не відсікає.
glStencil використовується для маскування окремих пікселів більш складними візерунками, такими як неправильні форми. Таким чином, glScissors швидше.
glScissor простіший, ніж проекційні перетворення з вікном перегляду.
Тест glScissor визначає, які пікселі слід змінити під час візуалізації, тоді як glViewport змінює, як gl повинен відображати координати пристрою до координат вікна.
Тоді яка різниця в налаштуванні області перегляду на прямокутник, який ви хочете відобразити, і налаштування матриці проекції для скасування масштабування, виконаного в області перегляду.
Viewport
вирізає обчислення вершин. Якщо ви намалюєте лінію з товщиною лінії> 1 або точку зgl_PointSize
> 1, ви також будете малювати поза вікном перегляду.