как обрабатывать глубину в glsl

#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 также есть кнопка, предназначенная для обозначения правильного ответа 🙂