Рендеринг 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, очевидно, что шейдер визуализирует свою «текстуру» на «полноэкранный четырехугольник», следуя координатам GL -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 показывает, что второй четырехъядерный рендерер на экране «правильный» для моих текущих требований и выполняет текстурирование так, как я хочу: повторяется дважды по вертикали и дважды по горизонтали (позднее будет зажато, повторение просто для тестирования здесь), в противном случае масштабирование без фильтрации текстур или мипмэппинга.

Таким образом, независимо от того, как изменяется размер окна (и, следовательно, порта просмотра), мы всегда видим полноэкранный четырехугольник с одной текстурой, повторяющейся дважды по горизонтали и дважды по вертикали.

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

Шейдер RTT ДЕЙСТВИТЕЛЬНО выполняет некоторый частичный рендеринг (или, возможно, полный, опять же, не могу быть уверен, что происходит за пределами экрана...) Особенно, когда вы изменяете размер области просмотра намного меньше, чем размер по умолчанию, вы видите разрывы между повторениями текстуры, и не все цвета, которые можно ожидать от нашего очень простого фрагментного шейдера RTT, действительно отображаются.

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

(B) или: текстура 512x512 отображается неправильно, и шейдер rtt frag каким-то образом меняет свой вывод в зависимости от разрешения окна — но почему? Закадровый четырехугольник всегда имеет значение -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 февраля 2012 г.

7
задан Nicol Bolas 9 March 2012 в 06:22
поделиться