Я использую OpenGL с шейдерами GLSL для обработки некоторых изображений. Я в основном использую framebuffers с орфографической проекцией для рендеринга моего изображения несколько раз (каждый с разными настройками для шейдера фрагмента).
Затем у меня есть 2 фреймбуфера с прикрепленными к ним текстурами, которые я визуализирую между ними (например, tex1 привязан к fb1, tex2 прикреплен к fb2. Первый проход отображает входную текстуру в fb1, второй проход передает tex1 в fb2, третий проход отображает tex2 в fb1... назад и вперед), пока последний проход не превратится из любой текстуры в выходной фреймбуфер.
Все это делается с использованием орфографических проекций, поэтому ни одно изображение не должно отсутствовать. Все это прекрасно работает, пока окно не изменится. Если я уменьшу высоту окна на половину изображения, оно будет только нарисовано в верхней половине окна, которое осталось (это за один проход, 2 прохода и оно будет только в верхней 1/4 окна). Может ли кто-нибудь понять, почему это происходит?
Второй снимок - после изменения размера окна до 3/4 его первоначальной высоты
http://i567.photobucket.com/albums/ss112/davidc538/rtip1.png
http://i567.photobucket.com/albums/ss112/davidc538/rtip2.png
Похоже, вы не обновляете свои размеры текстуры при изменении размера. т.е. ваше окно изменилось, но вы все еще смешаетесь с его первоначальными размерами.
Это означало бы, что вы уменьшаете/увеличиваете свое изображение на каждом проходе.
Вы можете избежать этого, обновив fbo во время изменения размера (я бы посоветовал округлить до ближайшей более большой мощности два) или оставив fbo с фиксированным размером и всегда отображая полное окно (хотя ваш образ будет размытым при оказании большого окна).
glViewport (...)
- это глобальное состояние, которое вы, вероятно, устанавливаете, когда изменяете размер окна, и не обращаете внимания на его переустановку при привязке FBO.