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

[Unity] [SRP] DOOM 2016 рендер

Страницы: 1 2 Следующая »
#0
(Правка: 15:58) 15:19, 30 июля 2019

Я пытаюсь сделать нормальный Z-prepass с early-z в Юнити. Как видно в заголовке через скриптабельный рендерпайплайн.

+ Примерно как тут на первой фазе

В чистом виде работает норм (когда рендер идет только в аппаратную глубину), но мне нужно отрендерить дополнительно в рендер-текстуру нормали с глубиной для всяких аналитических постпроцессов. Кодируется в RGBA8 RG - нормали, BA - глубина 16 бит.

Задавал я рендертаргет кучей разных способов, наиболее рабочий оказался такой

_commandBuffer.SetRenderTarget(camNormalsRT, BuiltinRenderTextureType.CameraTarget);

Но и тут не все в порядке. В GL работает вроде ок, на DX в игровом окне глубина флипнута по Y (а в окне редактора ок,), на Vulkan глубина поломана и из-за этого вообще ничего не рендерится в цветном пассе, когда проверка на equals.

Может мне кто-нибудь пояснить это концептуальная особенность DX или есть способ сделать нормальный кроссрендер, который сумеет отрисовать все одинаково и на OpenGL и на DX11 и, желательно, на Vulkan.

#1
15:44, 30 июля 2019

но Vulkan

#2
0:51, 31 июля 2019

Не какой версии такая проблема, и на каких версиях ты это пробовал?

#3
10:12, 31 июля 2019

На 2019.1.10+ проверял, на 2018 SRP до сих пор в превью вроде бы, API сильно поменяли. Насколько я понимаю это нормальное поведение.
https://docs.unity3d.com/Manual/SL-PlatformDifferences.html
Вопрос скорее в том, какого хрена глубина при рендеринге в RT флипается относительно глубины при рендеринге на экран (и почему поведение в окне Editor и в окне Game отличается) и как это побороть.
Про Вулкан может вулканологи просветят, в чем может быть нюанс при оффскрин-рендеринге.

#4
(Правка: 10:22) 10:20, 31 июля 2019

У Вулкана матрица 0.5 (полторушка, алканафт стайл АЙПИ)
https://community.khronos.org/t/understand-vulkan-clipping/6940/8
https://community.khronos.org/t/opengl-coordinate-system-to-vulka… matrix/6840/6

#5
(Правка: 11:21) 11:21, 31 июля 2019

... outpos : SV_POSITION ...
outpos.y *= _ProjectionParams.x;
+
Cull Off
Чинит проблему флипанья глубины на DX11, но зато в редакторе модель начинает кругом ходить. Судя по всему Unity состоит целиком из костылей и хаков.

#6
(Правка: 11:33) 11:24, 31 июля 2019
Судя по всему Unity состоит целиком из костылей и хаков.

Святой Юнити ! Такое говорить :)
Из Юнити только нисчаки сыплются, как из мешка деда мороза !
https://www.youtube.com/watch?v=-aKtcDbvP_w#t=80
#7
(Правка: 16:30) 16:28, 31 июля 2019

Dampire
Это не глубина флипнута, это флипнуты y-координаты текстур, это в спецификации GAPI можно посмотреть. В юньке попытались разные GAPI свести к единому фреймворку, поэтому флипают по Y в directX. Там есть keyword в шейдерах, чтобы проверить текущее состояние UNITY_UV_STARTS_AT_TOP.
НО, там еще может быть флипнута именно глубина, так как они юзают reversed z. Это тоже можно проверить кейвордом UNITY_REVERSED_Z. А еще глубина может быть в разных ренжах [1..0] [0..1] [-1...1]

#8
(Правка: 18:01) 18:00, 31 июля 2019

Bonus
Это глубина флипнута
When rendering into a Texture on a Direct3D-like platform, Unity internally flips rendering upside down.
А я рендерю именно что в текстуру. Reverse Z выставляется для платформы и не должен вообще никак влиять на equals рендер. В целом вопрос был решен несколькими костылями.
Когда происходит препасс, то я делаю вот такую херню, чтобы обойти особенности внутреннего рендера Unity

if (SystemInfo.graphicsDeviceType != GraphicsDeviceType.OpenGLCore && camera.cameraType != CameraType.SceneView)
{
    _cmd.SetProjectionMatrix(camera.projectionMatrix * Matrix4x4.Scale(new Vector3(1, -1, 1)));
    _cmd.SetInvertCulling(true);
}
Вопрос с вулканом пока что остается открытым, надо будет через рендердок его прогнать, понять что Unity там мудрит.

> А еще глубина может быть в разных ренжах [1..0] [0..1] [-1...1]
Это тут вообще никаким боком.

#9
20:03, 31 июля 2019

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

#10
21:43, 31 июля 2019

Dampire
Не спец по юнити, но разве он для этого сделан?
Юнити разрабатывается чтобы ты без труда взял модели из стора и без труда настроил их поведение. Это инструмент с конкретной целью.

#11
22:00, 31 июля 2019

g-cont
Они сейчас это пытаются исправлять через модули, но там столько легаси-говна, которое приходится поддерживать ради обратной совместимости.
122
Ну все можно подогнать под себя. На самом деле Юнити довольно гибкий. Можно и с таким подходом как ты описал делать, а можно что-то поинтереснее реализовывать, если знать как. Технически даже софтрендер возможен с недавних пор.

#12
(Правка: 22:21) 22:09, 31 июля 2019

Dampire
> Когда происходит препасс, то я делаю вот такую херню, чтобы обойти особенности
> внутреннего рендера Unity
Есть разные UnityCG.cginc модули там много оберток над стандартными расчетами чтобы не страдать обходными маневрами, там же с учетом флипа и прочего API. Например Linear01Depth.

#13
22:19, 31 июля 2019

foxes
А чем мне поможет шейдер, если у меня просто рендер не происходит? Там же аппаратный ZBuffer флипается из-за чего полноценный color-pass с ZTest  Equal не рисует ничего. Шейдер упрощает работу к примеру, с глубиной, приводя во всех реализациях к линейному 0..1, хоть у тебя GL, хоть DX с реверсом. Но мне не это надо, а надо чтобы отрисовка в аппаратную глубину не отличалась при рендере в текстуру и при рендере на экран.

#14
(Правка: 22:26) 22:23, 31 июля 2019

Dampire
> А чем мне поможет шейдер, если у меня просто рендер не происходит?
А как ты определяешь что он не происходит? Может ты не в том формате глубину читаешь. И с инверсией косяк может быть из за того что игра в DX работает, а редактор в GL.

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