Создание текстуры гистограммы буфера глубины с помощью GLSL - PullRequest
5 голосов
/ 13 апреля 2011

Я использую буфер глубины текущего контекста, чтобы влиять на отображаемую текстуру.Текстура 1-мерная и в оттенках серого.Слева направо представляет от ближнего к дальнему.Чем больше пикселей на определенной глубине, тем ярче текстура в этой точке: черный - нет пикселей на этой глубине, а белый - все пиксели на этой глубине.

Теперь у меня есть решение, которое делает glReadPixels() в буфере глубины анализирует его на процессоре и затем записывает обратно в текстуру.Естественно, это реальное узкое место в приложении.

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

Есть ли уловка или методика, которые мне не хватает, или я вынужден задействовать в этом процессор?

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

В качестве обновления к предложению @ Tommy я бы предложил использовать PBO вместо выборки текстур вершин:

  1. Копировать буфер глубины в PBO.
  2. Связать PBO как VBO, связать атрибут вершины (глубину) в нем.
  3. Вызовите DrawArrays с таким количеством элементов, как ваше разрешение буфера глубины. 4 ...
3 голосов
/ 13 апреля 2011

К счастью, есть хитрость: вершинные шейдеры тоже могут сэмплировать текстуры.Таким образом, вы можете выдать много GL_POINTS, каждый из которых соответствует отдельному фрагменту в текстуре глубины, а затем в вершинном шейдере вы можете прочитать текстуру глубины, чтобы определить преобразованную позицию точки.В вашем фрагментном шейдере для точек просто нарисуйте значение с подходящей альфа, чтобы вызвать желаемое накопление.

Итак, у вас есть вершинный шейдер, читающий одну текстуру, фрагментный шейдер не читает никаких текстур, и выВы используете обычный механизм рендеринга в текстуру для записи в гистограмму.

...