Размер фреймбуфера и отношение области просмотра
Я немного смущен отношениями между кадровым буфером и окном просмотра. У меня есть приложение, которое использует основной FBO размера screenWidth+1 и screenHeight. Я добавил один к ширине, потому что это единственный способ, который я нашел, который действительно включает полноэкранный режим в X11 (по крайней мере, на плате, которую мы используем).
В любом случае я создаю матрицы проекции и камеры на основе screenWidth & screenHeight (игнорируя +1). На самом деле нет никаких других ссылок на этот +1 в приложении, кроме случаев, когда мы создаем окно и основное FBO. В общем, я ожидал, что он будет работать нормально и просто будет пустой столбец пикселей в конце моего FBO.
Используемый видовой экран установлен как glViewport(0, 0, screenWidth, screenHeight). Координата y равна 0, потому что моя проекция переворачивается на ось y. Так было довольно долгое время, и (я думал) не было никаких артефактов из-за этого +1.
Но я сделал быстрый тест и изменил это значение +1 на +500 или другое большое число, и я заметил, что некоторые объекты в сцене были смещены вправо. Похоже, что отступ в FBO влияет на вещи.
Почему это так? Из того, что я понимаю, область просмотра преобразует нормализованные координаты устройства в координаты окна. Так что, если я правильно понимаю, используя screenWidth и screenHeight для области просмотра, я должен просто заполнить область screenWidth x screenHeight в FBO, исключая этот дополнительный пиксель в конце.
Может кто-то пролить свет на это? Должен ли я изменить свой видовой экран, чтобы он соответствовал размеру FBO?
1 ответ
Я ничего не знаю о необходимости дополнительного пикселя для полноэкранного рендеринга.
Тем не менее, вы правы в своем понимании области просмотра. Он используется для сопоставления нормализованных координат устройства (от -1 до +1) с координатами пикселей во вложениях FBO. (-1, -1) в нормализованной координате устройства - левый нижний угол области просмотра (параметры x и y glViewport()
). (+1, +1) - верхний правый угол окна просмотра. Поэтому размер в пикселях отображаемой поверхности в FBO не изменится, когда вы увеличите размер текстурных вложений.
После рендеринга, чтобы действительно отобразить что-то, у вас должна быть какая-то операция по переносу пикселей из визуализированной текстуры в пространство представления вашего окна. Обычно это стандартный кадровый буфер. Обычно вы переходите от своего рендеринга FBO (который может иметь мультисэмплинг) к кадровому буферу по умолчанию. Я ожидаю, что проблема будет в блицкой части вашего конвейера рендеринга.