Войти
ПрограммированиеФорумОбщее

Разработка под VR (10 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 16 7 8 9 10 11 Следующая »
#135
17:44, 5 мар. 2021

/A\
> Это из OpenGL ES, в десктопном нет мультивью.
Есть: https://opengl.gpuinfo.org/listreports.php?extension=GL_OVR_multiview (Только там везде одна нВидия, так что в немультивьюшное решение игра тоже должна уметь.)

#136
1:11, 7 мар. 2021

Сделал чередование глаз но особой разницы в скорости не обнаружил. Может где-то это и работает, но не на моей аппликации. Впрочем и вреда никакого.

#137
9:07, 10 мая 2021

Хочу попробовать организовать конкурс под VR на форуме, может в этой теме люди найдутся, пишите в лс

#138
(Правка: 12:26) 12:12, 10 мая 2021

>Хочу попробовать организовать конкурс под VR на форуме, может в этой теме люди найдутся, пишите в лс

А что за номинации?
Сейчас на стадии изучения "собственных возможностей" и пишу  вот такую технодемку  с поддержкой OpenVR с помощью FPC+Lazarus

Гиф ролик. (Сделано на старом ноуте так что FPS предсказуемо изрядный швах )
Запуск оп клику.
Изображение

А этот  ролик записывал не я а товарищ с  4PDA
Изображение

#139
19:18, 10 мая 2021

Leshiy999
Тему выберем голосованием из этой темы: https://gamedev.ru/projects/forum/?id=255353 . Номинаций не будет, участников бы набрать) Я тоже только ковыряю, месяц назад взял. Просто Unity тоже через конкурсы учил и тут решил ещё раз использовать ту же практику)

#140
(Правка: 21:22) 21:12, 10 мая 2021

1 За Unity (тем более в ВиАр) я если честно даже браться опасаюсь .
2 Голосование ? Интересно, правда сходу не понял как голосовать  и тем более как добавить тему
(Я  бы добавил тему "Илон Маск и Старшип - Марсианские хроники") 
3 Я вожусь где то с февраля этого года но довольно лениво . 

#141
22:44, 11 мая 2021

Перечитывал тут тему -

san
> Рендер для каждого глаза идет в свою половину текстуры, потом я ее разбиваю на
> две независимые как требуется для API.
А вот про "рендер каждого глаза в свою половину текстуры" хотелось бы узнать, как геометрия не залезает на чужую половину? Из оптимальных решений на ум приходит только хитрое манипулирование depth-тестом.

#142
22:47, 11 мая 2021

sinemual
> конкурс
У меня тут наполеоновские планы, много идей, времени на всё не хватает. Но, если конкурс будет, я впишусь с какой-нибудь технодемкой. Вот вам и тема кстати: конкурс технодемок. Полноценную VR-игру на конкурс вряд ли кто будет делать, а вот попробовать-поковырять, испытать сообща на других устройствах - это будет полезно.

#143
23:44, 11 мая 2021

romanshuvalov
> как геометрия не залезает на чужую половину?
Там же виюпорты настраиваются.

#144
0:12, 12 мая 2021

/A\
San сделал однопроходный рендерер при помощи инстансинга, один экземпляр рисуется в левую половину, другой в правую, за один draw call.

#145
1:00, 12 мая 2021

romanshuvalov
Гугли multiview. Это еще с мобилок пошло.

#146
4:01, 12 мая 2021

/A\
На предыдущую страницу перелистни, мы же это обсуждали. Да, я в курсе про мультивью, но san предложил похожее решение с использованием только лишь инстансинга, к нему вопрос про разграничение половинок вьюпорта.

#147
5:17, 12 мая 2021

romanshuvalov
Не помню что бы у меня были с этим затруднения. Сейчас я не за компом, утром могу выложить код.

#148
7:50, 12 мая 2021

romanshuvalov
Перечитал. Можно в фрагментном шейдере проверять координаты пикселя и номер инстанса. Но дискард может все замедлить немного.

А разве вариант 1 проход для дальних и 2 прохода для ближних не будет быстрее? Ну и мультивию есть везде кроме амд на гл, лучше его использовать.

#149
(Правка: 19:07) 18:47, 12 мая 2021

romanshuvalov
Вот добрался до компа. Давай по порядку:
При двухпроходном рендере все просто - хедсет дает матрицу левого глаза, аппликация выводит картинку в текстуру левого глаза. Потом все повторяется для правого глаза.
При однопроходном рендере у меня так: вместо одной матрицы я запоминаю сразу две, для обоих глаз. Выводная текстура в 2 раза шире. Вывод идет в один проход с использованиям 2х инстансов, каждый инстанс в свою половинку выводной текстуры. Получается S-B-S текстура, 3D телевизоры и многие программы ее понимают, но VR движки вроде нет. Потому я ее просто потом разбиваю на две тесктуры для каждого глаза.
Теперь реализация:

    if(!single_pass)
      DIRECTX->SetViewport(0, 0, desc.Width, desc.Height, commandList);
    else
      DIRECTX->SetStereoViewport(0, 0, desc.Width, desc.Height, commandList);
Видно, что в случае однопроходного рендера используется SetStereoViewport().
Смотрим ему в кишки:
void DirectX12::SetStereoViewport(float vpX, float vpY, float vpW, float vpH, ID3D12GraphicsCommandList* CommandList)
{
  D3D12_VIEWPORT D3Dvp[2];
  D3Dvp[0].Width = vpW/2;  D3Dvp[0].Height = vpH;
  D3Dvp[0].MinDepth = 0;   D3Dvp[0].MaxDepth = 1;
  D3Dvp[0].TopLeftX = vpX; D3Dvp[0].TopLeftY = vpY;

  D3Dvp[1] = D3Dvp[0];
  D3Dvp[1].TopLeftX = vpW/2;

  D3D12_RECT scissorRect[2];
  scissorRect[0].left = static_cast<LONG>(vpX);
  scissorRect[0].right = static_cast<LONG>(vpX + vpW);
  scissorRect[0].top = static_cast<LONG>(vpY);
  scissorRect[0].bottom = static_cast<LONG>(vpY + vpH);

  scissorRect[1] = scissorRect[0];

  CommandList->RSSetScissorRects(2, scissorRect);
  CommandList->RSSetViewports(2, D3Dvp);  // два вьюпорта
}

Идем дальше. Собственно рендер:

      activeCmdList->DrawIndexedInstanced(m_Surfaces[i].p_surface->size, single_pass ? 2 : 1, m_Surfaces[i].p_surface->offset, 0, 0);
Теперь шейдер:
cbuffer cbPass : register(b0)
{
  float4x4 ProjView[2];
  float4x4 ModelMat;
};

VSOut VS(VSIn vsIn)
{
  VSOut vsOut = (VSOut)0;
  vsOut.Pos = mul(ModelMat, vsIn.Position);
   
  vsOut.Position = mul(ProjView[vsIn.Instance], vsOut.Pos);

  vsOut.TexCoord = vsIn.TexCoord;
  vsOut.Normal = mul(ModelMat, float4(vsIn.Normal, 0));

  return vsOut;
}

Ну вроде все. Осталось разбить текстуру на две.
Но сразу хочу предупредить, ждать большого роста производительности не стоит. Будет быстрее, иногда на 20%, но чаще всего особой разницы вы не заметите. Все же тормозит не вертексный шейдер а пиксельный, а он в этом случае не изменился. Но в некоторых случаях разница заметна а накладные расходы минимальны. Так что есть смысл это использовать просто на всякий случай. Хуже не будет но может слегка поднять производительность.

Страницы: 16 7 8 9 10 11 Следующая »
ПрограммированиеФорумОбщее