OpenGL - есть ли способ хранить значения глубины выше 1? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь реализовать обнаружение столкновений на GPU, как в этой статье:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch29.html

На шаге 2 - Grid Generation мы используем тестирование глубины, чтобы убедиться, что мы только пишемИдентификаторы частиц больше, чем у предыдущего.

У меня есть эта работа прямо сейчас, разделив номер идентификатора на общее количество частиц:

gl_FragDepth = v_ID / u_totalParticleCount;

Но я боюсь, что если я доберусь до точки с большим количеством частиц, мне не хватит точности для этого.

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

Есть ли способ сделать это?Или единственный способ поставить мои идентификаторы в 0-1?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Глубина окна ограничена в пределах диапазона, указанного glDepthRange эта функция фиксирует значения, которые вы передаете в диапазон [0, 1].

Существует расширение NVIDIA, которое отключает это ограничение: NV_depth_range_float .Но в противном случае буферы глубины с плавающей точкой существуют, прежде всего, для обеспечения большей точности в [0, 1], а не больших чисел.

Текстуры компонентов глубины должны использовать форматы изображения глубины .Они не хранят RGBA;они хранят DEPTH_COMPONENT данных.Таким образом, 32-битный формат изображения с плавающей точкой будет GL_DEPTH_COMPONENT32F.

0 голосов
/ 18 мая 2018

Я не уверен, является ли использование буфера глубины для этого оптимального пути, поскольку то, что вы делаете, на самом деле никак не связано с глубиной, и многие аппаратные средства (особенно AMD) имеют некоторые оптимизации по глубине, которыеты будешь ломаться

Существует множество форматов буферов кадров, которые поддерживают то, что вы пытаетесь сделать, с более чистым решением (например, 32-разрядный целочисленный формат, который подойдет для 4 миллиардов).частиц).

...