Войти
ПрограммированиеФорумГрафика

Omni Shadows (4 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#45
11:04, 9 июля 2021

MikeNew
> И что совсем плохо - теряется возможность цпу-куллинга по камерам, что
> печально.
я с конечно не разбирался подробно с VK_KHR_multiview. Просто скорей всего аналог я сделаю для Direct3D12 потом возьмусь за Vulkan. Но в VK_KHR_multiview у нас же просто ViewPort + настройка RenderPass и предопределенная переменная в шейдере SV_ViewID
И почему нельзя получить список объектов для своей камеры(SV_ViewID) и кинуть на отрисовку? вот в том же примере от Саши:

for (int32_t i = 0; i < drawCmdBuffers.size(); ++i) {
    VkViewport viewport = vks::initializers::viewport((float)width / 2.0f, (float)height, 0.0f, 1.0f);
...// тут свой список будет
        // Left eye
        vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, viewDisplayPipelines[0]);
...// рисуем список для конкретной камеры
...// тут свой список будет
          vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, viewDisplayPipelines[1]);
...// рисуем список для конкретной камеры
}
Или я чего-то не понимаю?
Кстати куллить и на GPU мона, щас MDI есть даже не Adreno GPU.

#46
(Правка: 11:43) 11:38, 9 июля 2021

Andrey
> Или я чего-то не понимаю?
Может наоборот я что-то не понял.
Но вроде как VK_KHR_multiview просто повторяет n раз все команды в коммандном буфере и единственное что меняется:

1. Переменная gl_ViewIndex в шейдерах (меняется от 0 до n).
2. Слой в прикрепленном фреймбуфере (становится равен gl_ViewIndex)

Andrey
> вот в том же примере от Саши:
У Саши как-то странно сделано. Я так понял что основная фишка как раз в том чтобы не посылать одинаковые команды когда отличается все лишь, к примеру, одна матрица камеры а все остальное одинаковое, а послать один набор команд (нарисовать один раз) и этот один набор нарисует несколько раз с разными камерами и в разные слои фреймбуфера и все за один рендерпасс. А Саша два раза рисует вручную.
Хотя может это я туплю.

#47
15:50, 9 июля 2021

MikeNew
> Но вроде как VK_KHR_multiview просто повторяет n раз все команды в коммандном
> буфере и единственное что меняется:
> и этот один набор нарисует несколько раз с разными камерами и в разные слои фреймбуфера и все за один рендерпасс. А Саша два раза рисует вручную.
да. похоже на правду...
хм... тады с кулингом проблемка, хотя как-то решают это.

#48
9:18, 10 июля 2021

Andrey
> Кстати куллить и на GPU мона, щас MDI есть даже не Adreno GPU.
>

мона мона - делать на GPU шо можно на CPU это супер подход
ты хоть понял в чём поинт MDI? или так просто буковы пишешь?

#49
(Правка: 14:26) 14:25, 12 июля 2021

Bonus
> Я в итоге сделал честных 4 прохода, и клипал по диагоналям через
> SV_ClipDistance. У нас оно в продакшне сейчас живет, пару лет уже.
Вот что получилось, пока что без клипинга, но результат меня уже воодушевил. Я думал, что с моим геометрическим кретинизмом я такого достигну недели на две позже:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры
#50
10:05, 13 июля 2021

Круто!
Кину немного кода, для клиппинга, надеюсь будет полезно
На цпу:

m_PointLightClips[0] = CalculateLineEquationCoeffs(new Vector2(0, 0), new Vector2(-1, 1));
m_PointLightClips[1] = CalculateLineEquationCoeffs(new Vector2(1, 1), new Vector2(0, 0));

m_PointLightClips[2] = CalculateLineEquationCoeffs(new Vector2(0, 0), new Vector2(1, 1));
m_PointLightClips[3] = CalculateLineEquationCoeffs(new Vector2(1, -1), new Vector2(0, 0));

m_PointLightClips[4] = CalculateLineEquationCoeffs(new Vector2(0, 0), new Vector2(1, -1));
m_PointLightClips[5] = CalculateLineEquationCoeffs(new Vector2(-1, -1), new Vector2(0, 0));

m_PointLightClips[6] = CalculateLineEquationCoeffs(new Vector2(0, 0), new Vector2(-1, -1));
m_PointLightClips[7] = CalculateLineEquationCoeffs(new Vector2(-1, 1), new Vector2(0, 0));
private Vector3 CalculateLineEquationCoeffs(Vector2 p1, Vector2 p2)
        {
            // Уравнение прямой, проходящей через две заданные точки (x1,y1) и (x2,y2), имеет вид:
            // (y - y1) / (y2 - y1) = (x - x1) / (x2 - x1)
            // или в общем виде
            // (y1 - y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0
            // т.е. получили общее уравнение прямой на плоскости
            // Ax + By + C = 0
            // нам нужны коэффициенты A, B и C, чтобы передать их в шейдер
            Vector3 result = new Vector3(p1.y - p2.y, p2.x - p1.x, p1.x * p2.y - p2.x * p1.y);
            return result;
        }
В шейдере
output.clip[0] = -GetClipDistance(output.positionCS.xy, _FaceId, 0);
output.clip[1] = -GetClipDistance(output.positionCS.xy, _FaceId, 1);
float GetClipDistance(float2 clipPos, uint faceIndex, uint planeIndex)
{
    float3 coeffs = _Clips[faceIndex * 2 + planeIndex];
    return coeffs.x * clipPos.x + coeffs.y * clipPos.y + coeffs.z;
}

#51
(Правка: 10:48) 10:47, 13 июля 2021

шо такоя клиппинг?
куллинг шталь?

#52
10:50, 13 июля 2021

Misanthrope
SV_ClipDistance

#53
11:07, 13 июля 2021

Bonus
> SV_ClipDistance
ааа, ясно, сенькью

#54
(Правка: 13:23) 13:20, 13 июля 2021

Bonus
> Круто!
> Кину немного кода, для клиппинга, надеюсь будет полезно
Более чем полезно, обязательно воспользуюсь. Честно говоря, это именно то что нужно мне в данный момент. Спасибо!

#55
13:34, 13 июля 2021

Bonus
> В шейдере
Если не сложно, то полностью код шейдера можно? Для полного понимания (а то у меня GLSL, и чтобы врубится в принцип работы желателен полный код).

#56
13:41, 13 июля 2021

MikeNew
Нельзя к сожалению.
Тебе нужно раскурить аналог SV_ClipDistance семантики для OpenGL.

Вот это вычисления SV_ClipDistance в ВЕРТЕКСНОМ шейдере:

output.clip[0] = -GetClipDistance(output.positionCS.xy, _FaceId, 0);
output.clip[1] = -GetClipDistance(output.positionCS.xy, _FaceId, 1);

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

#57
22:03, 13 июля 2021

как тени смягчать придумали уже?))

#58
3:31, 14 июля 2021

Misanthrope
> как тени смягчать придумали уже?))
У тетра-теней с этим проблем нет, в отличие от кубмапы.

#59
(Правка: 6:23) 6:21, 14 июля 2021

Bonus
> Тебе нужно раскурить аналог SV_ClipDistance семантики для OpenGL.
Да, нужно полностью врубится в саму суть клипинга, по другому явно не выйдет.
Обращусь с вопросами по теории тогда , если что.

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумГрафика