Как хранить неограниченный диапазон глубины в буфере глубины Vulkan - PullRequest
0 голосов
/ 19 марта 2019

В первую очередь для целей отладки я хочу сохранить и повторно использовать в будущем буфер глубины вызовов рендеринга, который не ограничен диапазоном [0.0, 1.0], как ограничено спецификацией Vulkan.VK_EXT_depth_range_unrestricted, кажется, именно то, что мне нужно, поэтому у меня было

  1. Включено VK_EXT_depth_range_unrestricted,
  2. Установите диапазон глубины в окне просмотра на [0.0, 10.0],
  3. SetГраницы глубины VkPipelineDepthStencilStateCreateInfo равны [0.0, 10.0], deepTestEnable и deepWriteEnable равны VK_TRUE,
  4. Установите значение глубины очистки для прохода рендеринга равным 10,
  5. Растризовал некоторые треугольники, глубина каждой вершины равнадо 3,0

и обнаружил, что все пиксели карты глубины равны 1,0.Но я ожидал, что растеризованные пиксели будут иметь глубину 3,0, а не растеризованные - 10,0 (проверяется как в renderdoc, так и путем выгрузки буфера глубины в память хоста).

Отсюда мой вопрос: Возможно ли реально сохранить ненормализованную глубину в буфере глубины в Vulkan?Если да, то как мне это сделать?

ОБНОВЛЕНИЕ: Я создал репродуктор из примера рисования треугольника Саша Виллемса.Он находится в fork . При выполнении примера проверка ничего не сообщает.Я вижу пустое изображение (каждый пиксель очищен), однако я ожидал, что будет нарисован один треугольник (потому что каждая его вершина имеет глубину 3, а очищенная глубина - 5).На всякий случай устройство Vega RX, драйвер 18.50-ubuntu16.04.

1 Ответ

3 голосов
/ 19 марта 2019

В разделе вопросов спецификации расширения можно найти ряд других вещей, которые должны произойти. Поскольку вы не соизволили показать свой код, вот список:

  1. Формат изображения буфера глубины должен быть с плавающей точкой. Если это фиксированная точка, то значения будут по-прежнему ограничены этим диапазоном. Обратите внимание, что аппаратное обеспечение не должно поддерживать буферы глубины с плавающей точкой (хотя, если это не так, то шансы хороши, что это расширение также не поддерживает).

  2. Отсечение может по-прежнему применяться. Примитивы могут быть обрезаны до диапазона [0, W c ], где "W c " является четвертым компонентом позиции вершины пространства клипа. Чтобы остановить это, вы должны отключить ограничение глубины с помощью VkPipelineRasterizationStateCreateInfo::depthClampEnable = VK_TRUE (или VkPipelineRasterizationDepthClipStateCreateInfoEXT::depthClipEnable = VK_FALSE, если вы используете это расширение).

  3. Если ограничение глубины отключено, значения глубины по-прежнему будут ограничены диапазоном VkViewport::minDepth/maxDepth. Таким образом, вы должны убедиться, что это достаточно большой.

...