Создание текстуры гистограммы буфера глубины с помощью GLSL
Я использую буфер глубины текущего контекста, чтобы влиять на отображаемую текстуру. Текстура 1-мерная и в оттенках серого. Слева направо представляет от ближнего к дальнему. Чем больше пикселей на определенной глубине, тем ярче текстура в этой точке: черный цвет - нет пикселей на этой глубине, а белый - все пиксели на этой глубине.
Теперь у меня есть решение, которое делает glReadPixels()
в буфере глубины анализирует его на процессоре и затем записывает обратно в текстуру. Естественно, это реальное узкое место в приложении.
Я ищу решение для всего графического процессора, где буфер глубины анализируется в шейдере или что-то в этом роде, и обновляю текстуру таким образом. Я думал о создании фрагментного шейдера, который считывает значение глубины и увеличивает его до соответствующего пикселя в текстуре, но для этого потребуется, чтобы фрагментный шейдер мог записывать в другие текстуры. Что-то, чему я научился быть нет-нет, особенно если им нужно писать в один и тот же пиксель.
Есть ли у меня какая-то хитрость или техника, или я вынужден задействовать процессор?
2 ответа
К счастью, есть хитрость: вершинные шейдеры тоже могут пробовать текстуры. Таким образом, вы можете выдать много GL_POINTS, каждый из которых соответствует отдельному фрагменту в текстуре глубины, а затем в вершинном шейдере вы можете прочитать текстуру глубины, чтобы определить преобразованную позицию точки. В вашем фрагментном шейдере для точек просто нарисуйте значение с подходящей альфа, чтобы вызвать желаемое накопление.
Итак, у вас есть вершинный шейдер, читающий одну текстуру, фрагментный шейдер не читает никаких текстур, и вы используете обычный механизм рендеринга в текстуру для записи в гистограмму.
В качестве обновления к предложению @Tommy я бы предложил использовать PBO вместо выборки текстур вершин:
- Скопируйте буфер глубины в PBO.
- Связать PBO как VBO, связать в нем атрибут вершины (глубину).
- Вызовите DrawArrays с таким количеством элементов, как ваше разрешение буфера глубины. 4...