Я не знаю, можно ли здесь «поднять» старый вопрос, но мне пришло в голову несколько вещей:
Если ваши воксели статичны, вы можете ускорить весь процесс рендеринга, используя октодерево для отбраковки усеченного конуса и т. д. Кроме того, вы также можете скомпилировать статическую сцену в набор потенциальной видимости в октодереве. Основной принцип PVS заключается в предварительном вычислении для каждого узла дерева, какие другие узлы потенциально видны из него, и сохранении указателей на них в векторе. Когда дело доходит до рендеринга, вы сначала проверяете, в каком узле размещена камера, а затем запускаете отсечение усеченной пирамиды для всех узлов в PVS-векторе узла. (Кармак использовал что-то подобное в движках Quake, но с деревьями разделения двоичного пространства)
Если затенение ваших вокселей довольно сложное, также можно быстро выполнить предварительный проход только для глубины, без записи в цветовой буфер, просто для заполнения буфера глубины. После этого вы рендерите 2-й проход: отключите запись в буфер глубины и рендерите только в буфер цвета, проверяя буфер глубины. Таким образом, вы избегаете дорогостоящих шейдерных вычислений, которые впоследствии перезаписываются новым фрагментом, более близким к зрителю (Кармак использовал это в Quake3).
Еще одна вещь, которая определенно ускорит работу, — это использование Instancing. Вы сохраняете только положение каждого вокселя и, при необходимости, его масштаб и другие параметры в объекте текстурного буфера. Затем в вершинном шейдере вы можете прочитать позиции вокселей, которые должны быть созданы, и создать экземпляр вокселя (т. е. куб, который передается шейдеру в объекте вершинного буфера). Таким образом, вы отправляете 8 вершин + 8 нормалей (3 *sizeof(float) *8 +3 *sizeof(float) *8 + float для цвета/текстуры и т. д...) только один раз на карту в VBO, а затем только позиции экземпляров куба (3*sizeof(float)*количество вокселей) в TBO.
Возможно, можно распараллелить вещи между GPU и CPU, объединив все 3 шага в 2 потока, в потоке CPU вы проверяете pvs октодеревьев и обновляете TBO для экземпляра в следующем кадре, поток GPU тем временем выполняет рендеринг 2 проходит при использовании TBO для экземпляра, который был создан потоком ЦП на предыдущем шаге. После этого вы меняете TBO. Если камера не сдвинулась, вам даже не нужно снова выполнять расчеты ЦП.
Еще один тип дерева, который меня заинтересует, — это так называемое k-d-дерево, которое является более общим, чем октодеревья.
PS: извините за мой английский, он не самый чистый....
person
gary
schedule
26.04.2012