OpenGL рендеринг в текстуру через FBO - некорректное отображение по сравнению с нормальной текстурой

Внеэкранный рендеринг в текстурный объект закадрового буфера должен быть настолько тривиальным, но у меня возникла проблема, я не могу обернуть голову вокруг.

Моя полная программа примера (2D только сейчас!) Здесь:

http://pastebin.com/hSvXzhJT

Смотрите ниже некоторые описания.

Я создаю объект текстуры RGBA 512x512, привязываю его к FBO. На этом этапе не требуется никакой глубины или других буферов рендеринга, строго 2D.

Следующие чрезвычайно простые шейдеры визуализируют эту текстуру:

Вершинный шейдер:

varying vec2 vPos; attribute vec2 aPos;
void main (void) {
    vPos = (aPos + 1) / 2;
    gl_Position = vec4(aPos, 0.0, 1.0);
}

В aPos это просто получает VBO, содержащее 4 xy координаты для четырехугольника (-1, -1 :: 1, -1 :: 1, 1 :: -1, 1)

Таким образом, хотя теоретически разрешение кадрового буфера должно быть 512x512, очевидно, шейдер отображает свою «текстуру» в «квадроэкране с полным (выключенным) экраном», следуя парадигме координат GLs -1..1.

Фрагмент шейдера:

varying vec2 vPos;
void main (void) {
    gl_FragColor = vec4(0.25, vPos, 1);
}

Таким образом, он устанавливает полностью непрозрачный цвет с красным цветом, установленным на 0,25, и зеленым / синим в зависимости от x / y в диапазоне от 0 до 1.

На данный момент я предполагаю, что текстура 512x512 визуализируется, показывая только полноэкранный квадроцикл -1..1 с фрагментным оттенком зеленого / синего от 0..1.

Так что это моя закадровая настройка. На экране у меня есть еще один реально видимый полноэкранный квад с 4 координатами xyz {-1, -1, 1 ::: 1, -1, 1 ::: 1, 1, 1 ::: -1, 1, 1} Опять же, сейчас это 2D, поэтому нет матриц, и поэтому z всегда 1.

Этот четырехугольник нарисован другим шейдером, просто отображающим данную текстуру в стиле учебника GL-101. В приведенном выше примере программы у меня есть простой булевский переключатель doRtt, когда он имеет значение false (по умолчанию), рендеринг в текстуру не выполняется вообще, и этот шейдер просто показывает использование texture.jpg из текущего каталога.

Этот режим doRtt = false показывает, что второй экранный quad-renderer является «правильным» для моих текущих требований и выполняет текстурирование так, как я хочу: повторяется дважды по вертикали и дважды по горизонтали (позже будет зафиксировано, повторить только для тестирования здесь), в противном случае масштабирование без фильтрации текстур или mipmapping.

Поэтому независимо от того, как изменяется размер окна (и, следовательно, порта просмотра), мы всегда видим полноэкранный квад с одной текстурой, повторяемой дважды по горизонтали, дважды по вертикали.

Теперь, с doRtt = true, второй шейдер по-прежнему выполняет свою работу, но текстура никогда не полностью корректно масштабируется - или рисуется, в этом я не уверен, так как, к сожалению, мы не можем просто сказать: «Эй, спаси этот FBO на диск для цели отладки ".

RTT-шейдер выполняет частичный рендеринг (или, может быть, полный), опять же, не могу быть уверен, что происходит за кадром ...) Особенно, когда вы изменяете размер области просмотра намного меньше размера по умолчанию, вы видите разрывы между текстурами. повторяется, и не все цвета, которые можно ожидать от нашего очень простого RTT фрагментного шейдера, действительно показаны.

(A) либо: текстура 512x512 создана правильно, но не правильно отображается моим кодом (но почему с doRtt = false любой данный файл texture.jpg, использующий точно такой же простой текстурированный quad-шейдер, показывает просто отлично?)

(B) или: текстура 512x512 отображается неправильно, и каким-то образом шейдер rtt фрагмента изменяет свой вывод в зависимости от разрешения окна - но почему? Внеэкранный четырехугольник всегда равен -1..1 для x и y, вершинный шейдер всегда отображает это на координаты фрагмента 0..1, текстура RTT всегда остается в 512x512 для этого простого теста!

Обратите внимание, ОБА за пределами экрана и четыре экрана никогда не меняют свои координаты и всегда "полноэкранные" (-1..1 в обоих измерениях).

Опять же, это должно быть так просто. Что, черт возьми, мне не хватает?

Спецификации: OpenGL 4.2 (но код явно не нуждается в каких-либо функциях 4.2!), Nvidia Quadro 5010M, openSuse 12.1 64bit, Golang Weekly 22-Feb-2012.

Ответы на вопрос(1)

Ваш ответ на вопрос