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

Два рендер-таргета по выбору. (4 стр)

Страницы: 1 2 3 4
#45
2:08, 23 фев. 2021

san
> Как таргет менять тоже разобрались. Осталась глубина.
А в чём проблема? В доках про SV_RenderTargetArrayIndex написано This value also indicates which array slice of a depth/stencil view is used for read/write purposes. Значит глубину биндить так же, как и цвет.


#46
2:10, 23 фев. 2021

san
Ну так получается, что тебе не подходит просто в шейдере указывать индекс рендертаргета, ведь тогда ты можешь каждый объект отрисовать лишь в один из глаз, даже когда объект должен быть виден из обоих.
Почему ты решил, что в Unity оба глаза рисуются за один присест? Я на 99% уверен, что они решили по старой традиции особо не заморачиваться.
Вообще ты можешь вместо двух пачек рендертаргетов/буферов глубины создать одну, просто в 2 раза шире. И рисовать слева один глаз, а справа второй, тогда менять рендертаргеты не потребуется. Но от этого в принципе ничего не изменится, все равно сначала рисуешь один глаз, потом другой.

#47
(Правка: 6:25) 2:50, 23 фев. 2021

Dimich
> А в чём проблема? В доках про SV_RenderTargetArrayIndex написано This value also indicates which array slice of a depth/stencil view is used for read/write purposes. Значит глубину биндить так же, как и цвет.
Так проблема была не в том как биндить, а как вытащить разные таргеты при отрисовке инстансов. Но это уже решили, теперь проблема с дептом. Поскольку депт похоже массивом не передается. Функция OMSetRenderTargets принимает количество рендеров но не количество дептов.

phridrich
> Ну так получается, что тебе не подходит просто в шейдере указывать индекс рендертаргета, ведь тогда ты можешь каждый объект отрисовать лишь в один из глаз, даже когда объект должен быть виден из обоих.
Почему? Я каждый обьект сцены рисую инстансами, т.е. 2 раза но за один колл. Функция DrawIndexedInstanced. При этом вертексный шейдер фактически вызывается дважды, каждый раз со своим значением номера инстанса и я умножаю все на матрицу для соответствующего глаза (я их две передаю). Тут-то все как раз просто.

>Почему ты решил, что в Unity оба глаза рисуются за один присест? Я на 99% уверен, что они решили по старой традиции особо не заморачиваться.
Да нет, там по уму сделано, они это называют Instanced Stereo:  https://docs.unity3d.com/Manual/SinglePassStereoRendering.html
Т.е. сделать это можно. Осталось понять как.

#48
4:26, 23 фев. 2021

san
> Поскольку депт похоже массивом не передается. Функция OMSetRenderTargets
> принимает количество рендеров но не количество дептов.
Тебе сами DepthStencilView и RenderTargetView нужно создавать на 2 слайса от Texture2DArray, а не от обычной текстуры. Написано же английским по белому.

#49
5:13, 23 фев. 2021

MrShoor
Мне нужен не один депт а два. Для каждого глаза свой. Но я похоже придумал как обойтись одним рендером и одним дептом без всего этого геморроя. Собственно я это описал еще в первом посте - нужно сделать таргет (и депт) в 2 раза шире чем сейчас и рендерить каждый инстанс в свою половину текстуры вместо разных таргетов. Когда все обьекты отрисуются, разбить ее на две текстуры которые нужны OpenVR и все. Я сказал, что это "как-то криво", но по другому еще уродливее. Так хоть не нужны два таргета и два депта, проверка на VPAndRTArrayIndexFromAnyShaderFeedingRasterizer и прочие изыски. Из накладных расходов - две лишние текстуры. Думаю на этом я и остановлюсь. Если вообще сподоблюсь применить этот метод.

#50
13:55, 23 фев. 2021

san
По твоей ссылке делают то, о чем я говорил - один широкий рендертаргет для двух глаз. Но про инстансинг я там ничего не заметил, просто рисуют оба глаза одновременно.
Мне кажется ты снова задаешь вопрос конкретнее, чем тебе нужен ответ. Что ты вообще пытаешься оптимизировать? Просто на GPU все эти изыски никаких ускорений не дадут. У тебя процессор под завязку загружен?

#51
(Правка: 16:16) 14:56, 23 фев. 2021

phridrich
>По твоей ссылке делают то, о чем я говорил - один широкий рендертаргет для двух глаз. Но про инстансинг я там ничего не заметил, просто рисуют оба глаза одновременно.

Да нет, там просто для понятности два глаза на одной картинке нарисованы. Это не значит что они обязательно в одну широкую текстуру выводят. В Юнити используют два метода, один аппаратный (https://developer.nvidia.com/vrworks/graphics/singlepassstereo), второй програмный. Аппаратный имеет крупный недостаток - хреново работает на современных хедсетах (https://iliaskapouranis.com/2020/07/13/is-single-pass-stereo-worth-it/). На RTX это исправили, но не у всех такие карты.
Остается програмный. Он на инстансах которые и "рисуют оба глаза одновременно" экономя на двойном рендере геометрии. Как в Юнити это сделано в кишках они не раскрывают, но кое какая информация есть. Судя по всему они используют (или использовали раньше) один таргет двойной ширины вместо двух разных. Я же попробовал реализовать переключение таргетов но видимо был неправ.

>Просто на GPU все эти изыски никаких ускорений не дадут
Дают. Так можно где-то 20-25% времени сэкономить. В VR скорость очень критична, скажем Valve Index имеет частоту 144 герца и за эти 7 мс нужно нарисовать сцену размером 2700х2400 дважды. Но все зависит от сцены - если там много высокополигональных моделей то будет выигрыш. Если много сложных пиксельных шейдеров - смысла нет.

P.S.
Нашел я как это в Юнити сделано, таки я был прав, они рисуют инстансами на текстуре двойной ширины. https://blogs.unity3d.com/2017/11/21/how-to-maximize-ar-and-vr-pe… eo-rendering/

#52
15:25, 23 фев. 2021

san
> Да нет, там просто для понятности два глаза на одной картинке нарисованы. Это не значит что они обязательно в одну широкую текстуру выводят.
Второе предложение по твоей ссылке: It renders both left and right eye images at the same time into one packed Render Texture that is twice the width of a single eye texture.
> Остается програмный. Он на инстансах которые и "рисуют оба глаза одновременно" экономя на двойном рендере геометрии.
Рисуют оба глаза одновременно - да. Но про инстансинг я никаких сведений не вижу.
Погуглил слегка, похоже, что тебе поможет SV_ViewportArrayIndex. Делаешь широкий рендертаргет на оба глаза, когда вызываешь RSSetViewports и RSSetScissorRects - передаешь туда 2 вьюпорта и скиссора, один на левый глаз, другой на правый, и в шейдере указываешь какой тебе надо через SV_ViewportArrayIndex. Иронично, что первым ответом на твой вопрос была как раз эта семантика - надо было не капризничать, а вбить ее в гугл, там сходу все расписано.
Правда, я все равно советовал бы не морочиться с буферами на 2 инстанса, а рисовать отдельно.
> Дают. Так можно где-то 20-25% времени сэкономить.
С чего бы это вдруг? Инстансинг никак не влияет на объем вычислений, производимый видеокартой. Меняется только источник per-instance данных, в обычном случае это константный буфер, при инстансинге - per-instance вертексный буфер. Так что это чисто CPU-оптимизации, ну или скинь пруф.

#53
(Правка: 15:57) 15:47, 23 фев. 2021

phridrich
>Инстансинг никак не влияет на объем вычислений, производимый видеокартой.
Имелась ввиду общая производительность. Важна fps а не ее составляющие.
Почитай последнюю ссылку в предыдущем посте там много информации по этой теме.

>Рисуют оба глаза одновременно - да. Но про инстансинг я никаких сведений не вижу.
Читаем: "We can use GPU Instancing in order to issue a single draw call and allow the GPU to multiplex our draws across both eyes. We can double the existing instance count of a draw (if there are no instance usage, we just set the instance count to 2). Then in the vertex shader, we can decode the instance ID in order to determine which eye we are rendering to."

#54
15:57, 23 фев. 2021

san
Вчитываться лень, но в конце есть картинка с гистограмой, и там инстансинг не влияет на GPU-время.
В целом, да, важен именно FPS. Но если у тебя GPU frame time больше чем CPU frame time, то эти заморочки с инстансингом ни на что не повлияют. А если CPU frame time больше - перейди на DX12 и забудь об этой проблеме.

#55
16:12, 23 фев. 2021

phridrich
У меня DX12, но CPU от этого нулевым не становится. Я не уверен что сингл-пасс мне что-то существенное даст, я просто хотел собрать информацию как это можно сделать дабы попробовать. Все же наверно не зря Юнити и Унреал ее используют. Хотя статья по второй ссылке мою решимость сильно поколебала.

#56
18:06, 23 фев. 2021

san
> Как в Юнити это сделано в кишках они не раскрывают
Да собери проект в юнити, да через рендердок глянь, как там сделано. Для разработчика с огого стажем (как раз твоим стажем) это пол часа делов.

#57
18:13, 23 фев. 2021

MrShoor
Ну во первых у меня нет Юнити и я никогда с ней дел не имел. Равно как и с Анреал. Я обычно все ручками. Во вторых я уже нашел описание как там это сделано. Последняя ссылка в 51 посте. И даже выяснил, что на особый прирост производительности рассчитывать не стоит.

#58
0:13, 24 фев. 2021

Если кого-то эта тема интересует, то вот тут есть весь код для решения этой задачи: https://docs.microsoft.com/en-us/windows/mixed-reality/develop/na… ng-in-directx
Микрософт переключает таргеты в отличие от Юнити. У кого работает быстрее - не могу сказать.

Страницы: 1 2 3 4
ПрограммированиеФорумГрафика