Получить пиксель за текущим пикселем

Я пишу программу на C ++ с переизбытком, рендеринг 3D-модели в окне.
я использую glReadPixels чтобы получить изображение пейзажа, отображаемого в окнах.

И я хотел бы знать, как я могу получить для конкретного пикселя (x, y) не напрямую его цвет, а цвет следующего объекта позади.

Если я отрисовываю синий треугольник и красный треугольник перед ним, glReadPixels дает мне красные цвета от красного треугольника.

Я хотел бы знать, как я могу получить цвета от синего треугольника, который я получу от glReadPixels если красный треугольник не был здесь.

1

Решение

По умолчанию кадровый буфер сохраняет только самый верхний цвет. Чтобы получить то, что вы предлагаете, потребуется определенный конвейер рендеринга.

Например, вы могли бы:

  1. Создайте закадровый кадровый буфер того же размера, что и целевой экран
  2. Рендеринг прохода только для глубины в буфер закадрового кадра, сохраняющий значения глубины в прикрепленной текстуре
  3. Повторно визуализируйте сцену с помощью специального шейдера, который рисует только те пиксели, у которых значения Z после преобразования были МЕНЬШЕ, чем значение в ранее записанном буфере глубины.

Окончательный результат последнего рендера должен быть исходной сценой с удаленным верхним слоем.

Редактировать:

Для создания закадрового кадрового буфера и рендеринга версии сцены только для глубины потребуется лишь небольшое количество нового кода, и вы можете использовать существующий конвейер рендеринга в сочетании с ним для выполнения шагов 1 и 2.

Однако я не могу придумать, каким образом вы могли бы затем повторно визуализировать сцену, чтобы получить необходимую информацию на шаге 3 без шейдера, потому что это и стандартный тест глубины плюс тест на предоставленную текстуру глубины. Это не значит, что его нет, просто я не очень хорошо разбираюсь в трюках GL.

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

5

Другие решения


По вопросам рекламы [email protected]