Вопрос

Насколько я знаю, мы не можем прочитать значение Z (глубина) в OpenGL ES 2.0.Итак, мне интересно, как мы можем получить координаты трехмерного мира из точки на двухмерном экране?

На самом деле у меня есть некоторые случайные мысли, которые могут сработать.Поскольку мы можем прочитать значение RGBA с помощью glReadPixels, как насчет того, чтобы продублировать буфер глубины и сохранить его в буфере цвета (скажем, ColorforDepth).Конечно, должно быть какое-то хорошее соглашение, чтобы мы не потеряли информацию о буфере глубины.А затем, когда нам нужны мировые координаты точки, мы прикрепляем этот цветовой буфер ColorforDepth к кадровому буферу и затем визуализируем его.Поэтому, когда мы используем glReadPixels для чтения информации о глубине в этом кадре.

Однако это приведет к вспышке на один кадр, поскольку буфер цвета представляет собой странный буфер, преобразованный из буфера глубины.Мне все еще интересно, есть ли какой-нибудь стандартный способ получить глубину в OpenGL es 2.0?

Спасибо заранее! :)

Это было полезно?

Решение

Используя FBO, вы можете выполнять рендеринг без отображения результатов.Если вы используете ES 2.0, ваш фрагментный шейдер может получить доступ к глубине текущего фрагмента (в координатах окна) как часть gl_FragCoord, поэтому вы можете записать это в буфер цвета, использовать glReadPixels, чтобы получить результат обратно и продолжить.В качестве альтернативы вы можете загрузить мировое пространство z ​​как переменную и записать ее из фрагментного шейдера, если это проще.

Чтобы убедиться в этом, попробуйте написать быстрый шейдер, который поспешно выводит gl_FragCoord.z ​​с низкой точностью, напримертолько

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

Вы должны получить оттенки серого с интенсивностью цвета, представляющего глубину.Поскольку вы находитесь в оконных координатах, интенсивность будет варьироваться от 0,0 (ближайший возможный необрезанный фрагмент) до 1,0 (самый дальний возможный необрезанный фрагмент).Чтобы не потерять большую точность, вероятно, более полезно разделить значение между компонентами, поскольку ваш поставщик почти наверняка не поддерживает целевые буферы с плавающей запятой.

Другие советы

Я использую базовый литье Ray для выбора 3D-объекта с экрана. На самом деле я рассчитываю пересечение между нормальным экраном на сенсорной точке и сфере, содержащей мой объект. Для очень точного выбора или сложной формы вы должны использовать несколько сферов.

Вы также можете проецировать несколько ключевых точек вашего объекта в 2D-пространстве вашего экрана (мое умножение вашей 3D-точек на вашу матрицу преобразования), а затем сделайте некоторое 2D сравнение (расстояние) с вами.

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

Как предполагает, что Винсент, если у вас есть простые фигуры, такие как сферы, литья, вероятно, лучше.

Для более сложных форм Tho, я думаю о том, чтобы рендеринг объекта к (потенциально меньшему) буферным буфере вручную вручную присвоить один из цветных компонентов каждой вершины, чтобы быть глубиной этой вершины, а затем чтение значений цвета. Это несколько нелегантно и раздражает, и требует, чтобы вы могли преобразовать объект-пространство для экрана пространства (я использую свои собственные кватернионы для привода матриц, так что это заботится о том). Может быть способ с шейдерами, чтобы написать информацию о глубине в цвет или буфер трафарета (GL даже имеет буфер трафарета?)

Если кто-то имеет более чистый подход, я бы хотел услышать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top