Трябва ли да извиквате glViewport всеки път, когато обвързвате кадров буфер с различна резолюция?

Имам програма с около 3 фреймбуфера с различни размери. Инициализирам ги в началото, давам им подходящата цел за изобразяване и променям размера на прозореца за изглед за всеки един.

Първоначално мислех, че трябва да извикате glViewport само когато инициализирате фреймбуфера, но това създава проблеми в моята програма, така че предполагам, че е грешно? Тъй като всички те се различават по разделителна способност, в момента, когато изобразявам във всеки кадър, свързвам първия буфер на кадри, променям размера на прозореца за изглед, за да пасне на този буфер на кадри, свързвам втория буфер на кадри, променям размера на прозореца за изглед, за да пасне на разделителната способност на втория буфер на кадри, свързвам трети framebuffer, променете размера на прозореца за изглед, за да го побере, след това свържете буфера на рамката на прозореца и променете размера на прозореца за изглед към разделителната способност на прозореца.

Необходимо ли е това или нещо друго в програмата е виновно? Това се прави във всеки кадър, така че се притеснявам, че ще има малко ненужни разходи, ако не трябва да го правя.


person Goldboa    schedule 15.11.2015    source източник


Отговори (2)


Първоначално мислех, че трябва да извикате glViewPort само когато инициализирате буфера на кадрите, но това създава проблеми в моята програма, така че предполагам, че е грешно?

Да, това е погрешно предположение (вероятно подхранвано от безброй лоши уроци, които не поставят glViewport).

glViewport винаги принадлежи към чертожния код. Винаги извиквате glViewport с правилните параметри точно преди да начертаете нещо в буфер на кадри. Параметрите, зададени от glViewport, се използват в конвейера за трансформация, така че трябва да помислите за glViewport като команда, подобна на glTransform (в конвейера на фиксирана функция) или glUniform.

person datenwolf    schedule 15.11.2015
comment
Благодаря ти! :) Във всички уроци използвах същата разделителна способност във фреймбуферите като прозореца. - person Goldboa; 15.11.2015

Винаги трябва да извиквате glViewport(), преди да започнете да рисувате към фреймбуфер с различен размер. Това е необходимо, тъй като прозорецът за изглед не е част от състоянието на буфера на кадрите.

Ако погледнете например спецификацията на OpenGL 3.3, раздел 6.2, озаглавен „Таблици на състояния“, започващ на страница 278, съдържа таблици с цялото състояние, показващи обхвата на всяка част от състоянието:

  • Таблица 6.23 на страница 299 изброява "състояние на обект на буфер на кадри". Единственото изброено състояние са буферите за изтегляне и буферът за четене. Ако прозорецът за изглед беше част от състоянието на буфера на кадрите, той щеше да бъде посочен тук.
  • Прозорецът за изглед е посочен в таблица 6.8 „състояние на трансформация“. Това е глобално състояние и не е свързано с никакъв обект.

OpenGL 4.1 въвежда множество прозорци. Но те все още са част от глобалната трансформационна държава.

Ако се чудите защо е така, единственият истински отговор е, че е дефиниран по този начин. Гледайки графичния тръбопровод, има смисъл. Докато извикването glViewport() прави да изглежда така, сякаш указвате правоъгълник в рамките на буфера на кадрите, към който искате да изобразите, извикването всъщност дефинира трансформация, която се прилага като част от фиксирания функционален блок между върховия шейдър (или геометричен шейдър, ако имате такъв) и фрагментен шейдър. Настройките на прозореца за изглед определят как NDC (нормализираните координати на устройството) се нанасят върху координатите на прозореца.

Състоянието на буфера на кадрите, от друга страна, определя как изходът на фрагментния шейдър се записва в буфера на кадрите. Така че контролира напълно различна част от тръбопровода.

От начина, по който прозорците за изглед обикновено се използват от приложенията, мисля, че щеше да има по-голям смисъл да направите прозорците за изглед част от състоянието на буфера на кадрите. Но OpenGL наистина е API, предназначен като абстракция на графичния хардуер, и от тази гледна точка прозорецът за изглед е независим от състоянието на буфера на кадрите.

person Reto Koradi    schedule 15.11.2015