2016-07-03 12 views
0

В настоящее время я работаю над проектом, который использует shadowtextures для визуализации теней.
Это было довольно легко для прожекторов, так как требуется только одна текстура в направлении прожектора, но ее немного сложнее, так как ей нужны либо 6 текстур во всех направлениях, либо 1 текстура, которая каким-то образом отображает все объекты вокруг точечного света.
И вот где моя проблема. Как я могу сгенерировать матрицу Projection, которая каким-то образом отображает весь объект под углом 360 вокруг фокуса?
В основном, как создать рыбий глаз (или любую другую 360-градусную камеру) вершинный шейдер?Как получить матрицу проекции, которую я могу использовать для теневой карты pointlight?

ответ

0

Как создать матрицу проекции, которая каким-либо образом отображает весь объект под углом 360 градусов вокруг точки света?

Вы не можете. Проекционная матрица 4x4 в однородном пространстве не может представлять никакой операции, которая приведет к изгибу краев многоугольников. Прямая линия остается прямой.

В основном, как создать рыбий глаз (или любую другую 360-градусную камеру) вершинный шейдер?

Вы также не можете этого сделать, по крайней мере, не в общем случае. И это не предел используемой матрицы проецирования, а общий предел растеризатора. Разумеется, вы могли бы поместить формулу для искажения рыбий глаз в вершинный шейдер. Но растеризатор все равно растеризует каждый треугольник с прямыми краями, вы просто искажаете положение угловых точек каждого треугольника. Это означает, что это будет верно только для крошечных треугольников, покрывающих один пиксель. Для больших треугольников вы полностью испортите изображение. Если у вас есть такие вещи, как T-суставы, это даже приводит к отверстиям или перекрытиям в объектах, которые на самом деле должны быть полностью закрыты.

Это было довольно легко прожекторами, так как только одна текстура в направлении внимания необходимо, но его немного более трудным, так как она должна либо 6 текстур во всех направлениях или 1 текстура, которая каким-то образом делает все obects вокруг точки света.

Правильное решение для этого будет использовать единую текстуру карты куба с шестью гранями. В идеальном кубе каждая грань может быть визуализирована стандартной симметричной перспективной проекцией с полем обзора 90 градусов как по горизонтали, так и по вертикали.

В современном OpenGL вы можете использовать layered rendering. В этом случае вы присоединяете каждую из 6 граней карты куба как один слой к FBO, и вы можете использовать геометрический шейдер для усиления геометрии 6 раз и преобразовать его в соответствии с 6 различными матрицами проекций, чтобы вам все равно нужен только один проход для полной карты теней.

Существуют и другие расширения для конкретного поставщика, которые могут использоваться для дальнейшей оптимизации рендеринга кубической карты, например, Nvidia NV_viewport_swizzle (доступно на Maxwell и более новых графических процессорах), но я упоминаю об этом только для полноты.

+0

большое спасибо, я искал двойную параблочную визуализацию, но я, вероятно, в конечном итоге получаю кубкет, спасибо – user2741831