Как я могу прочитать буфер глубины в WebGL? - PullRequest
7 голосов
/ 07 сентября 2011

Используя API WebGL, как я могу получить значение из буфера глубины или каким-либо другим способом определить трехмерные координаты из экранных координат (т. Е. Найти местоположение, на которое нажали), кроме как путем выполнения моей собственной лучевой передачи?*

Ответы [ 5 ]

7 голосов
/ 07 сентября 2011

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

Для получения дополнительной информации см. Ответы на один из моих старых вопросов: WebGL - глубина рендеринга в текстуру fbo не работает

Если вы ищете в Google открытые окна и карты теней или глубины, вы найдете больше объяснений и пример исходного кода.

6 голосов
/ 07 ноября 2015

Прошло несколько лет, в наши дни расширение WEBGL_depth_texture широко доступно ... если только вам не нужна поддержка IE.

Общее использование:

Подготовка:

  1. Запрос расширения (обязательно)
  2. Выделение отдельной текстуры цвета и глубины (gl.DEPTH_COMPONENT)
  3. Объединение обеих текстур в один кадровый буфер (gl.COLOR_ATTACHMENT0, gl.DEPTH_ATTACHMENT)

Рендеринг:

  1. Привязка кадрового буфера, визуализация вашей сцены(обычно упрощенная версия)
  2. Отсоедините буфер кадров, передайте текстуру глубины вашим шейдерам и прочитайте ее, как любую другую текстуру:

    texPos.xyz = (gl_Position.xyz / gl_Position.w) * 0.5 + 0.5;
    float depthFromZBuffer = texture2D(uTexDepthBuffer, texPos.xy).x;
    
3 голосов
/ 07 сентября 2011

Из раздела 5.13.12 спецификации WebGL кажется, что вы не можете непосредственно прочитать буфер глубины, поэтому, возможно, предложение Маркуса - лучший способ сделать это, хотя вам может не понадобиться FBO дляthis.

Но если вы хотите сделать что-то вроде выбора, есть другие способы для этого.Просто просмотрите ТАК, как это часто задавали.

1 голос
/ 05 февраля 2012

По состоянию на 23 января 2012 года существует черновое расширение WebGL, позволяющее считывать данные из буфера глубины, WEBGL_depth_texture . У меня нет информации о его доступности в реализациях, но я не ожидаю этого на столь раннем этапе.

1 голос
/ 10 сентября 2011

Не совсем дубликат, но см. Также: Как получить объект в трехмерном пространстве WebGL из координаты щелчка мыши

Помимо непроецирования и приведения луча (а затем выполнения испытаний на пересечение спо мере необходимости), ваш лучший выбор, чтобы посмотреть на «комплектации».Это не даст точные трехмерные координаты, но это полезная замена для непроецирования, когда вы заботитесь только о том, на каком объекте щелкнули , и вам не нужна точность на пиксель.

Выбор в WebGL означает визуализацию всей сцены (или, по крайней мере, интересующих вас объектов) с использованием определенного шейдера.Шейдер отображает каждый объект с другим уникальным идентификатором, который кодируется в красном и зеленом каналах, используя синий канал в качестве ключа (не синий означает отсутствие интересующего объекта).Сцена отображается в закадровом кадровом буфере, так что она не видна конечному пользователю.Затем вы читаете, используя gl.readPixels (), интересующий пиксель или пиксели и видите, какой идентификатор объекта был закодирован в данной позиции.

Если это поможет, см. мою собственную реализацию выбора WebGL..Эта реализация выбирает прямоугольную область пикселей;переход в область 1x1 приводит к выбору в одном пикселе.См. Также функции в строках 146, 162 и 175.

...