#opengl #glsl #depth #fbo
#opengl #glsl #глубина #fbo
Вопрос:
У меня проблема с FBO и глубиной в OpenGL. Я передаю матрицы проекции, представления и модели шейдеру, который записывает данные в буфер g. Когда я отвязываю FBO и записываю в gl_FragColor, сцена отображается так, как должна. Но когда я пишу в gl_FragData[0], а затем записываю сопутствующую текстуру в квадрат, выровненный по экрану, объекты рисуются в соответствии с обратным порядком обработки, а не с глубиной… Я могу видеть объекты, обработанные первыми, до объектов, обработанных после. У кого-нибудь была такая же проблема, и знают ли они решение? Или кто-нибудь может предоставить синтаксис для считывания значений глубины из вершинного шейдера, запроса текущей глубины, а затем записи в буфер глубины в зависимости от сравнения, т.Е. Обработки операции вручную в шейдере фрагментов.
Комментарии:
1. Вся ваша теория звучит правильно, так что, скорее всего, это просто ошибка в вашем коде. Без этого кода мы не можем точно сказать.
Ответ №1:
Ваш основной фрейм-буфер, скорее всего, имеет глубину, в то время как созданный вручную FBO может ее не иметь. Поэтому при выводе на экран у вас есть геометрия, отсортированная по глубине, в то время как ваш FBO не может этого обеспечить и внутренне работает с отключенным тестированием глубины, не имея связанного с ним хранилища.
Комментарии:
1. Ты прав, кварк. Я не понимал, что прикрепление буфера глубины к fbo является требованием для отбора глубины в текстурах, связанных с fbo. Также выяснилось, что gl_FraDepth[i] устарел в пользу определения собственных переменных out.
2.
gl_FragData
устарело, нетgl_FraDepth[]
. В интерфейсе stackoverflow также есть кнопка, предназначенная для обозначения правильного ответа 🙂