Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Графика, рендер, шейдеры
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91
DRKIP
Ну да((( Я блумом то это могу исправить, но как тогда исправить расчет блума, что бы он на траве артифакты не давал вот это вопрос. Просто делаю свою модификацию, а эта проблема меня уже просто в гроб свела. Из за нее многое приходиться делать не так как хотелось бы, а проще и в итоге хуже.
macron
Цитата(Diesel @ 06.05.2020, 11:37) *
в рендер ЗП

Да он вообще для модднига косячный, фиг добавишь свой скриптовой s-шейдер.

DRKIP, попробуй откатиться на 2.0.945. Если не поможет, иди на amk, там были темы по OGSR. Здесь мало кто это ковыряет.
DRKIP
Цитата(macron @ 06.05.2020, 15:05) *
Цитата(Diesel @ 06.05.2020, 11:37) *
в рендер ЗП

Да он вообще для модднига косячный, фиг добавишь свой скриптовой s-шейдер.

DRKIP, попробуй откатиться на 2.0.945. Если не поможет, иди на amk, там были темы по OGSR. Здесь мало кто это ковыряет.

Да у них эта байда уже давно тянется.
Я с начала думал может в шейдерах косяк какой, но прикручивал другие толку ноль. Скорей всего где-то в движке косяк. Хотя бог его знает. Я не спец в этом.
Ну и рендер блума бог его знает как исправить))
На АМК врятле. Там в основном ошибки правят и разбирают. Рендер там вообще никто не трогает.
Да для моддинга в плане рендера не айс. Но другова нет под R3-R4 к сожалению.
Diesel
! Can't find texture ''

Кто посоветует, как быть? Или забить на это?
Diesel
Вот така голубизна. Это безлайтмапный уровень. Кое как воду осветлил в шейдерах. Тупо помножил цвета и отражение.


А вот серая текстура воды, новая.
Diesel
А мне нравится. Текстуру пены приспособил для захлестов волн в далеке. wink.gif


45 лет на могучей западно-сибирской реке прожил, и никакой пены не видел.
Пена на воде это идиотизм ( но не всегда, во время коренной воды пена идёт, но она как пенопласт топырщится, а не как плёнка керосина у Пысов).
RayTwitty
Diesel, у тебя спина белая цвет отражений ночью серый и выглядит не естественно.
Diesel
RayTwitty, а зачем там видеть корявые отражения? Ты видел отражения ОГСЕ? Там в одном отражении, елка из кусков отражений.

Там енв коректировать надо, что бы реально хеми заходило.
RayTwitty
Diesel, лолшто? Я конкретно про цвет говорил.
Diesel
RayTwitty, я понял, хеми хреново работает.
Diesel
Я уже устал.
ввел переменную хеми для воды, а надо то для отражения. Дебил я. завтра надо искать куда это применить.

laugh.gif

Diesel
Забыл как вводится корректировка rgb в шейдерах.


Нужно убрать бронзовый оттенок. Корректировка цвета текстуры не подходит. В инете посмотрел код бронзы 205, 127, 50

Кто подскажет?
Diesel
Короче я фигней занимаюсь. Максимум по дефолту вот что выжал, и то читал в тырнете, что это бывает у безмозговых правщиков.


А в огсе не надо делать хеми, там читаются енв настройки погоды из конфига. Так что два дня потерял в пустую.
Zagolski
Что-то затихло тут все. Посему для поднятия настроения сообщу кое-какую интересность, которая мне позволила поднять производительность на ванильном деферреде на 10%, а в некоторых случаях даже больше.

Все это касается отрисовки ландшафта. Поскольку ландшафт может является очень хорошим окклюдером, это можно использовать для повышения производительности. Суть в том, что ландшафт мы рендерим с z-prepass (предварительный проход по глубине с отключенной записью цвета). Этим мы получаем целых две вкусные плюшки.

1. Поскольку сначала у нас заполнен буфер глубины только ландшафтом, при отрисовке всех последующих объектов при заполнении g-buffer перекрытые ланшафтом объекты будут отклоняться ранним z-test (кроме альфа-теста), пиксельный шейдер на них даже не запустится, тем самым мы получим хорошую экономию bandwidth. Что для deferred render очень важно.

2. Второй проход ландшафта непосредственно при заполнении g-buffer мы делаем самым последним, когда буфер глубины у нас уже заполнен. Соответственно, значительная часть ландшафта может быть перекрыта другими объектами вроде кустов, зданий, каменей, травы (особенно травы). Отрисовку мы делаем конечно же с D3DCMP_EQUAL и опять же ранний z-test будет отклонять все пиксели с ландшафтом, которые закрыты другими объектами. Пиксельный шейдер ландшафта тяжелый, поэтому мы вдовесок получим еще большую экономию bandwidth.
Diesel
Zagolski, понятно. Уже приступаю к реализации.
Этот комментарий кому адресован? Товарищ Кьяхо может и поймёт. Но 99% мододелов просто ничего не поняли.

Я же всё таки малость понял, так как ковырял шейдеры, но всё же лучше сделать это на примерах шейдеров.
Zagolski
Там нет ничего сложного. В самый низ r__dsgraph_render.cpp добавим:

Код
void __fastcall pLandscape_0(mapLandscape_Node *N)
{
    VERIFY(N);
    dxRender_Visual *V = N->val.pVisual;
    VERIFY(V && V->shader._get());
    RCache.set_Element(N->val.se, 0);
    float LOD = calcLOD(N->val.ssa, V->vis.sphere.R);
#ifdef USE_DX11
    RCache.LOD.set_LOD(LOD);
#endif
    V->Render(LOD);
}

void __fastcall pLandscape_1(mapLandscape_Node *N)
{
    VERIFY(N);
    dxRender_Visual *V = N->val.pVisual;
    VERIFY(V && V->shader._get());
    RCache.set_Element(N->val.se, 1);
    RImplementation.apply_lmaterial();
    float LOD = calcLOD(N->val.ssa, V->vis.sphere.R);
#ifdef USE_DX11
    RCache.LOD.set_LOD(LOD);
#endif
    V->Render(LOD);
}

void R_dsgraph_structure::r_dsgraph_render_landscape(u32 pass, bool _clear)
{
    RCache.set_xform_world                    (Fidentity);
    if (pass==0)    mapLandscape.traverseLR    (pLandscape_0);
    else            mapLandscape.traverseLR    (pLandscape_1);
    if (_clear)        mapLandscape.clear        ();
}


Туда же в R_dsgraph_structure добавляем аналогично какому-нибудь mapSorted это (не забываем и mapLandscape.destroy(); ему сделать сразу после mapSorted.destroy(); ):
Код
R_dsgraph::mapLandscape_T                                    mapLandscape;


в r__dsgraph_types.h в самом конце добавим это:
Код
    typedef FixedMAP<float,_MatrixItemS,render_allocator>            mapLandscape_T;
    typedef mapLandscape_T::TNode                            mapLandscape_Node;


В ф-цию r_dsgraph_insert_static ближе к концу перед
Код
for ( u32 iPass = 0; iPass<sh->passes.size(); ++iPass)


добавляем:

Код
    if (sh->flags.bLandscape && RI.phase == CRender::PHASE_NORMAL)
    {
        mapLandscape_Node* N = mapLandscape.insertInAnyWay(distSQ);
        N->val.ssa = SSA;
        N->val.pObject = NULL;
        N->val.pVisual = pVisual;
        N->val.Matrix = Fidentity;
        N->val.se = sh;
        return;
    }


К флагам шейдеров добавим новый bLandscape (аналогично другим также инициализируем), а в blender_BmmD.cpp сразу после case SE_R1_NORMAL_HQ: и case SE_R1_NORMAL_LQ: добавим
Код
C.SH->flags.bLandscape = TRUE;


Отсеять ландшафт отдельно можно и другим способом, я сделал вот так. Также можно вместо создания mapLandscape создать в mapNormalPasses третий элемент, а ландшафт отсеивать туда с другим уникальным приоритетом 3-4. И отрисовывать соответственно как r_dsgraph_render_graph(3); но это будет запутаннее, хотя в какой-то степени и проще.

И сразу после C.SH->flags.bLandscape = TRUE; и в high и в low добавим:

Код
C.r_Pass    (shadow_direct_base, shadow_direct_base, FALSE, TRUE, TRUE);
C.r_ColorWriteEnable(false, false, false, false);
C.r_End();


И там же, но уже после uber_deffer добавим:

Код
C.RS.SetRS(D3DRS_ZFUNC, D3DCMP_EQUAL);


Хорошо бы еще в uber_deffer или где-то еще отключить запись глубины только для ландшафта. В uber_deffer есть такая штука:
Код
C.r_Pass        (vs,ps,    FALSE);

Для ландшафта делаем (внедрим bool в ф-цию)
Код
C.r_Pass        (vs,ps,    FALSE, TRUE, FALSE);


Вот и все. В CRender::Render () перед установкой MRT г-буфера (перед BOOL split_the_scene_to_minimize_wait = FALSE;) ставим нулевой рендертаргет с одним только буфером глубины:
Код
Target->u_setrt                ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,!RImplementation.o.dx10_msaa?HW.pBaseZB:rt_MSAADepth->pZRT);

и сразу после делаем
Код
r_dsgraph_render_landscape(0, false);


А после if(Details) Details->Render (); (в обоих местах) делаем:

Код
r_dsgraph_render_landscape(1, true);


Забыл добавить, сам предварительный проход ландшафта очень дешевый, практически бесплатный.
И вот еще что. traverseLR запускает отрисовку с сортировкой от ближнего к дальнему, при большом кол-ве разных шейдеров возможна потеря скорости на CPU, а поскольку у нас тут всего 2 шейдера, причем второй запускается на дистанции 50 м и далее, а первый действует до 50 м, перестановок шейдеров на втором пассе практически не будет. То есть волноваться не стоит.
Diesel
Zagolski, вот уже понятнее.
Опробирую на гипер-движке. Боюсь, что рендер выппрыгнет за пределы вселенной.

Наконец то, впервые в мире фпс станет пятизначным.
Diesel
Zagolski, я малость встрял. У меня другой 3й рендер в гиперзвуке.

У тебя шесть знаков в коде.
Target->u_setrt ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,!RImplementation.o.dx10_msaa?HW.pBaseZB:rt_MSAADepth->pZRT);

А моё чудо принимает четыре или шесть с Target->.

Примерно выглядеть будет так:
Target->u_setrt ( Target->rt_Generic_0_r,Target->rt_Generic_1,RImplementation.Target->rt_MSAADepth->pZRT );
или так:
u_setrt ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,rt_MSAADepth->pZRT);



И что? Пойду тестировать. Что то собралось.

При запуске вылет, как раз на моей Target->u_setrt ( Target->rt_Generic_0_r,Target->rt_Generic_1,RImplementation.Target->rt_MSAADepth->pZRT );

stack trace:

0023:0439E26E rClient.dll, CRender::Render(), i:\scs_3_4_source_code\clearsky\engine\layers\xrrenderpc_r3\r3_r_render.cpp, 315
0023:046AC2D9 xrGame.dll, CLevel::OnRender(), i:\scs_3_4_source_code\clearsky\engine\xrgame\level.cpp, 777
0023:0045760E xrEngine.exe, CEnvironment::SelectEnvs(), i:\scs_3_4_source_code\clearsky\engine\xrengine\environment.cpp, 411
0023:0045706A xrEngine.exe, CEnvironment::load_weather_effects(), i:\scs_3_4_source_code\clearsky\engine\xrengine\environment_misc.cpp, 714
Diesel
Собрал, главное тени и террайн на месте. biggrin.gif


Пойду еще подумаю, как извратиться.

Короче у меня террайн скрывает весь визуал (на его фоне нет проекции), террайн-оклюддер всего и вся(кроме теней и воды).
Diesel
Даже не террайн виноват, а как будто всё вывернуто фейсами наружу. И приоритет визуалов нарушен.



Zagolski, а это как?
C.r_Pass (shadow_direct_base, shadow_direct_base, FALSE, TRUE, TRUE);

"shadow_direct_base" - у меня везде в ковычках идет.


Блин, а тут надо добавлять в этих файлах? У меня компиль шейдеров в оперативу идёт, не как в ЗП.

I:\SCS_3_4_Source_Code\clearsky\engine\Layers\xrRender\Blender_detail_still.cpp(85):#include "uber_deffer.h"
I:\SCS_3_4_Source_Code\clearsky\engine\Layers\xrRender\Blender_detail_still.cpp(104):#include "uber_deffer.h"
I:\SCS_3_4_Source_Code\clearsky\engine\Layers\xrRender\Blender_Model_EbB.cpp(135):#include "uber_deffer.h"
I:\SCS_3_4_Source_Code\clearsky\engine\Layers\xrRender\Blender_Model_EbB.cpp(175):#include "uber_deffer.h"
I:\SCS_3_4_Source_Code\clearsky\engine\Layers\xrRender\Blender_tree.cpp(138):#include "uber_deffer.h"
I:\SCS_3_4_Source_Code\clearsky\engine\Layers\xrRender\Blender_tree.cpp(168):#include "uber_deffer.h"


C.SH->flags.bLandscape = TRUE;
C.r_Pass (shadow_direct_base, shadow_direct_base, FALSE, TRUE, TRUE);
C.r_ColorWriteEnable(false, false, false, false);
C.r_End();


uber_deffer (C, true, "impl","impl",false,oT2_Name[0]?oT2_Name:0,true);

C.RS.SetRS(D3DRS_ZFUNC, D3DCMP_EQUAL);
Diesel
C.r_Pass (vs,ps, FALSE); - у меня только так визуал нормальный.

C.r_Pass (vs,ps, FALSE, TRUE, FALSE); - а так сразу глюки.

Ладно, я разберусь на досуге. Я в отпуск на лето поехал, так что не теряйте.

RayTwitty
При сохранении текстуры с мип-уровнями в paint.net у меня спрашивают, что я хочу заюзать: Fant, Супервыборка, Билинейная, Бикубическая, Метод ближайшего соседа. Всё более менее понятно со всеми кроме Fant. Не смог толком ничего нагуглить про него .__.
Zagolski
Diesel, Я некоторое навскидку писал, потому как у меня несколько иначе сделано. Если
Код
Target->u_setrt ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,!RImplementation.o.dx10_msaa?HW.pBaseZB:rt_MSAADepth->pZRT);

не идет, тогда сделай как
Код
if (!RImplementation.o.dx10_msaa) Target->u_setrt ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,HW.pBaseZB);
else Target->u_setrt ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,rt_MSAADepth->pZRT);


И да, shadow_direct_base нужно в кавычках писать. Я бы там исправил, но уже нет доступа.

Цитата(Diesel @ 19.05.2020, 02:40) *
C.r_Pass (vs,ps, FALSE, TRUE, FALSE); - а так сразу глюки.

Это нужно делать только для ландшафта. В саму uber_deffer можно добавить в конце bool DO_NOT_WRITE=false, а в теле ф-ции сделать типа того:
Код
if (DO_NOT_WRITE) C.r_Pass (vs,ps, FALSE, TRUE, FALSE);
else C.r_Pass (vs,ps, FALSE);

Ну и соотв. в blender_BmmD.cpp вызывать ее с true, а во всех остальных случаях она будет как false.
RayTwitty
Цитата(RayTwitty @ 19.05.2020, 04:55) *
При сохранении текстуры с мип-уровнями в paint.net у меня спрашивают, что я хочу заюзать: Fant, Супервыборка, Билинейная, Бикубическая, Метод ближайшего соседа. Всё более менее понятно со всеми кроме Fant. Не смог толком ничего нагуглить про него .__.

Вообщем погуглил еще получше и по всему написанному делаю вывод, что Fant аналогичен опции "Лучшее качество" при уменьшении размера изображения. А при создании мипов как раз это и происходит.
Zagolski
Тут кое-что прояснилось. Я ранее считал, что в сталке диффузные текстуры хранятся в SRGB формате. Оказалось, нет. Они сохранены в линейном формате и соотв. шейдинг происходит тоже в линейном, то есть корректно.
SkyLoader
Цитата(Zagolski @ 20.05.2020, 12:15) *
Я ранее считал, что в сталке диффузные текстуры хранятся в SRGB формате.

Эм, такие форматы пришли только с ДХ10. Как их могли использовать?

Цитата(RayTwitty @ 20.05.2020, 00:19) *
что Fant аналогичен опции "Лучшее качество" при уменьшении размера изображения.

Что значит лучшее качество? (вопрос не к тебе, если что) Это же просто метод фильтрации. У каждого фильтра свой алгоритм. Грубо говоря, с одним алгоритмом мипы будут мыльнее, с другим более четкие.
Zagolski
Цитата(SkyLoader @ 20.05.2020, 13:04) *
Эм, такие форматы пришли только с ДХ10. Как их могли использовать?

Я не так выразился. Не в SRGB формате, а в SRGB цветовом пространстве.
Diesel
Zagolski, я вернулся.

Я заоптимизировал отражения огсе, даже не лагают. Но одно уточнение, это уже смомтриться иначе, чем в оригинале.
Что поделать, сетевая, требует жертв. Но вода смотриться опупенно, почти как в CE2. laugh.gif

Сегодня до ума буду делать то, что выше писал.

И еще я сегодня установил (что раньше не знал), что кроме R1 билд лайт в рендере не читается. А я тут всем гнал. Значит у меня нет преимущества перед ТЧ.
Diesel
Вода примерно такая.


jamakasi
Diesel, выглядит как tf2, освещение сломано.
Diesel
jamakasi, понятно что сломано. Я примерно в фотошопе подогнал визуал скрина.
На самом деле в игре приятнее графа.
Но еще: этот рендер нельзя сравнивать со сталком, тут другая технология подготовки уровня и освещения. У меня уникальный рендер, macron не даст соврать, это гибридный ренедер ЧН и ЗП, да плюс немерено накручено по шейдерам.

Позднее я выровню яркость неба и яркость воды.
Diesel
Zagolski, спасибо за оптимизацию. Такого у меня еще не было, сразу отпустило заметно, в кадрах не скажу фпс - лень выводить.
Обязательно тебе памятник в Прохоровке поставлю.
Zagolski
Можно еще препасс травы сделать, тогда получим еще больший буст. На первом скрине по дефолту, на втором с препассом (см. фпс). Для травы вообще очень желательно препасс делать, особенно на отложенном рендере. Иначе получим дикий overdraw. Видяха GTX 660.



Diesel
Zagolski, надо начинать препассы готовить к зиме.
sergy172
Готовь sunny летом...
Diesel
Zagolski, где твои препассы? Я жду. biggrin.gif
А что такая графа хреновая на скринах, гипер-рендер и то симпатичнее выдаёт картину.
eagleivg
Zagolski, подскажи, попробовал перенести на OpenXRay, но оно крэшится на втором проходе:
Код
1   CBackend::set_Element                                                                                                             R_Backend_Runtime.h   124 0x7fffe7922be4
2   pLandscape_1<xr_fixed_map_node<float, R_dsgraph::_MatrixItemS>>                                                                   r__dsgraph_render.cpp 694 0x7fffe7922be4
3   xr_fixed_map<float, R_dsgraph::_MatrixItemS, 2ul, xalloc<xr_fixed_map_node<float, R_dsgraph::_MatrixItemS>>>::recurse_left_right  FixedMap.h            163 0x7fffe7922ed6
4   xr_fixed_map<float, R_dsgraph::_MatrixItemS, 2ul, xalloc<xr_fixed_map_node<float, R_dsgraph::_MatrixItemS>>>::recurse_left_right  FixedMap.h            163 0x7fffe7922ed1
5   xr_fixed_map<float, R_dsgraph::_MatrixItemS, 2ul, xalloc<xr_fixed_map_node<float, R_dsgraph::_MatrixItemS>>>::recurse_left_right  FixedMap.h            163 0x7fffe7922ed1
6   xr_fixed_map<float, R_dsgraph::_MatrixItemS, 2ul, xalloc<xr_fixed_map_node<float, R_dsgraph::_MatrixItemS>>>::recurse_left_right  FixedMap.h            163 0x7fffe7922ed1
7   xr_fixed_map<float, R_dsgraph::_MatrixItemS, 2ul, xalloc<xr_fixed_map_node<float, R_dsgraph::_MatrixItemS>>>::recurse_left_right  FixedMap.h            163 0x7fffe791f094
8   xr_fixed_map<float, R_dsgraph::_MatrixItemS, 2ul, xalloc<xr_fixed_map_node<float, R_dsgraph::_MatrixItemS>>>::traverse_left_right FixedMap.h            371 0x7fffe791f094
9   D3DXRenderBase::r_dsgraph_render_landscape                                                                                        r__dsgraph_render.cpp 707 0x7fffe791f094
10  CRender::Render                                                                                                                   gl_R_render.cpp       432 0x7fffe781d819
11  CLevel::OnRender                                                                                                                  Level.cpp             633 0x7fffe615ff15
12  pureRender::OnPure                                                                                                                pure.h                20  0x7ffff7f90252
13  MessageRegistry<pureRender>::Process                                                                                              pure.h                101 0x7ffff7f90252
14  CRenderDevice::DoRender                                                                                                           device.cpp            272 0x7ffff7f90252
15  CRenderDevice::DoRender                                                                                                           device.cpp            261 0x7ffff7f90252
16  CRenderDevice::ProcessFrame                                                                                                       device.cpp            299 0x7ffff7f9050c
17  CRenderDevice::ProcessFrame                                                                                                       device.cpp            283 0x7ffff7f9050c
18  CRenderDevice::message_loop                                                                                                       device.cpp            426 0x7ffff7f9131f
19  CRenderDevice::Run                                                                                                                device.cpp            460 0x7ffff7f91654
20  Startup                                                                                                                           main.cpp              305 0x7ffff7f96472


Код примерно такой:
Код
template<class T>
void __fastcall pLandscape_0(const T& N)
{
    VERIFY(N);
    dxRender_Visual *V = N.second.pVisual;
    VERIFY(V && V->shader._get());
    RCache.set_Element(N.second.se, 0);
    float LOD = calcLOD(N.second.ssa, V->vis.sphere.R);
#ifdef USE_DX11
    RCache.LOD.set_LOD(LOD);
#endif
    V->Render(LOD);
}

template<class T>
void __fastcall pLandscape_1(const T& N)
{
    VERIFY(N);
    dxRender_Visual *V = N.second.pVisual;
    VERIFY(V && V->shader._get());
    RCache.set_Element(N.second.se, 1);
    RImplementation.apply_lmaterial();
    float LOD = calcLOD(N.second.ssa, V->vis.sphere.R);
#ifdef USE_DX11
    RCache.LOD.set_LOD(LOD);
#endif
    V->Render(LOD);
}

void D3DXRenderBase::r_dsgraph_render_landscape(u32 pass, bool _clear)
{
    RCache.set_xform_world                    (Fidentity);
    if (pass==0)    mapLandscape.traverse_left_right    (pLandscape_0);
    else            mapLandscape.traverse_left_right    (pLandscape_1);
    if (_clear)        mapLandscape. clear        ();
}


Падает внутри вызова RCache.set_Element(N.second.se, 1);

Походу, я что-то забыл, но вот что...

Если что, полный патч приложен.
RayTwitty
Цитата(Diesel @ 22.05.2020, 13:46) *
Zagolski, надо начинать препассы готовить к зиме.

Шо толку от этих препассов если мы не видим диффы!
Diesel
eagleivg, смотри внимательно, что бы в динамику не затолкать.

В ф-цию r_dsgraph_insert_static ближе к концу перед
Код
for ( u32 iPass = 0; iPass<sh->passes.size(); ++iPass)

Я случайно в динамику хренакнул, вылетало так же примерно.
Zagolski
eagleivg, Я у тебя нашел пару неточностей, а в остальном порядок.
1.
Код
C.SH->flags.bLandscape = TRUE;
нужно ставить также и в
Код
case SE_R2_NORMAL_LQ:

2. При установке рендертаргета нужно делать if else в зависимости от включенного MSAA: ставить базовый буфер глубины или мультисемплинговый. Вот так:
Код
if (!RImplementation.o.dx10_msaa) Target->u_setrt ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,HW.pBaseZB);
else Target->u_setrt ( Device.dwWidth,Device.dwHeight,NULL,NULL,NULL,rt_MSAADepth->pZRT);

Еще у тебя организована какая-то самодеятельность в ResourceManager_Scripting.cpp. Я туда ничего не внедрял, может из-за этого проблемы.

Цитата(Diesel @ 22.05.2020, 22:47) *
А что такая графа хреновая на скринах, гипер-рендер и то симпатичнее выдаёт картину.

Там у меня нет ничего, ни постпроцесса, ни даже теней. Только базовое освещение diff+spec, считай как на статике.

Цитата(Diesel @ 22.05.2020, 22:47) *
где твои препассы? Я жду.

С травой сложнее, как будет время, опишу процесс внедрения.
Zagolski
Я ранее писал, что на втором проходе нужно отключить запись в буфер глубины. Но не привел конкретного примера. Глюков мы не получим, если не сделаем, но производительность малость ухудшится из-за двойной записи в буфер глубины.
Поэтому обязательно лезем в
Код
void    uber_deffer    (CBlender_Compile& C, bool hq, LPCSTR _vspec, LPCSTR _pspec, BOOL _aref, LPCSTR _detail_replace=0, bool DO_NOT_FINISH=false);

и добавляем в конце
Код
void    uber_deffer    (CBlender_Compile& C, bool hq, LPCSTR _vspec, LPCSTR _pspec, BOOL _aref, LPCSTR _detail_replace=0, bool DO_NOT_FINISH=false, bool DO_NOT_WRITE=false);

а в теле ф-ции, где есть
Код
C.r_Pass        (vs,ps,    FALSE);

Меняем его, делая так:
Код
C.r_Pass        (vs,ps,    FALSE, TRUE, DO_NOT_WRITE?FALSE:TRUE);


В Blender_BmmD.cpp в SE_R2_NORMAL_HQ и в SE_R2_NORMAL_LQ, где у нас вызов uber_deffer, делаем в ней в конце true, вот так:
Код
uber_deffer        (C, true,    "impl","impl",false,oT2_Name[0]?oT2_Name:0,true,true);


Либо можно в Blender_BmmD.cpp в SE_R2_NORMAL_HQ и в SE_R2_NORMAL_LQ сразу после uber_deffer добавить это:
Код
C.PassSET_ZB(TRUE, FALSE);

В этом случае модификации uber_deffer не требуется.

Хотя с другой стороны в PassSET_ZB есть проверка
Код
if (Pass())    bZWrite = FALSE;

То есть при наличии первого инициализированного прохода второму принудительно отключается запись глубины. Так что возможно никаких вышеописанных манипуляций делать и не потребуется, GSC уже все продумала за нас. Но вообще я советую внедрить код в uber_deffer первым вариантом, оно может пригодиться в дальнейшем и даст лучшую масштабируемость при внедрении других фич.
Zagolski
Народ, протестите такую штуку у себя и скажите, ускорилась ли загрузка и насколько, стало ли шустее бегать, особенно в меню/ интерфейсе.
Лезем в dx10Texture.cpp в texture_load, в _DDS_2D: сразу после
Код
LoadInfo.FirstMipLevel = img_loaded_lod;

добавляем
Код
LoadInfo.MipLevels = IMG.MipLevels;

Diesel
Zagolski, сейчас заценим.

А у меня вообще, бошку открутили:

//LoadInfo.FirstMipLevel = img_loaded_lod;


Zagolski, шустро, но не понятно так было или стало. biggrin.gif

Я совет дам по оптимизации. Если вы не используете какие то локации, то выкиньте их из базы.
Загрузка увеличивается в разы если выкинуть все локации ЧН, а оставить одну новую например.
Текстуры нужно паковать с линковкой к конкретной локации, если на других локациях они не используются - это ускорит загрузку и оптимизирует уровни.

Diesel
Сто пудово правленый рендер x-ray уделает cryengine 2.
Я довольно долго (года два biggrin.gif ) изучал CE, так по игре можно сказать, что это примерно 3.4.3 версия Крайэнгины, примерно ( это я за свой гипер-звук толкую).
Diesel
Zagolski, я не сразу заметил, но повторная загрузка уровня крашиться.

r_dsgraph_render_landscape(1, true);



Лог
Вылет


0023:0299F7E8 rClient.dll, CBackend::set_Element(), i:\scs_3_5_1_source_code\clearsky\engine\layers\xrrender\r_backend_runtime.h, 95
0023:029A458B rClient.dll, pLandscape_1(), i:\scs_3_5_1_source_code\clearsky\engine\layers\xrrender\r__dsgraph_render.cpp, 829
0023:029A4674 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 79
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:029A4670 rClient.dll, FixedMAP<float,R_dsgraph::_MatrixItemS,doug_lea_allocator>::recurseLR(), i:\scs_3_5_1_source_code\clearsky\engine\xrcore\fixedmap.h, 78
0023:0299E5DC rClient.dll, CRender::Render(), i:\scs_3_5_1_source_code\clearsky\engine\layers\xrrenderpc_r3\r3_r_render.cpp, 446
0023:0467C779 xrGame.dll, CDialogHolder::shedule_Scale()
0023:0467C779 xrGame.dll, CDialogHolder::shedule_Scale()


Всё сюда прилетает

IC void CBackend::set_Element (ShaderElement* S, u32 pass)
{
SPass& P = *(S->passes[pass]);
set_States (P.state);
set_PS (P.ps);
set_VS (P.vs);
#ifdef USE_DX10
set_GS (P.gs);
#endif // USE_DX10
set_Constants (P.constants);
set_Textures (P.T);
#ifdef _EDITOR
set_Matrices (P.M);
#endif
}

Что то я наверно лишнего нагородил.
Diesel
Zagolski, может причина в dx10?

Функции
HRESULT dx10State::Apply()
{
VERIFY(m_pRasterizerState);
StateManager.SetRasterizerState(m_pRasterizerState);
VERIFY(m_pDepthStencilState);
StateManager.SetDepthStencilState(m_pDepthStencilState);
if( m_uiStencilRef != -1 )
StateManager.SetStencilRef(m_uiStencilRef);
VERIFY(m_pBlendState);
StateManager.SetBlendState(m_pBlendState);
StateManager.SetAlphaRef(m_uiAlphaRef);

SSManager.GSApplySamplers(m_GSSamplers);
SSManager.VSApplySamplers(m_VSSamplers);
SSManager.PSApplySamplers(m_PSSamplers);

return S_OK;
}

Или тут:

void dx10SamplerStateCache::PrepareSamplerStates(
HArray &samplers,
ID3D10SamplerState *pSS[D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT],
SHandle pCurrentState[D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT],
u32 &uiMin,
u32 &uiMax
) const
{
// It seems that sizeof pSS is 4 wor win32!
ZeroMemory(pSS, sizeof(pSS[0])*D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT);

for ( u32 i=0; i<samplers.size(); ++i )
{
if (samplers[i]!=hInvalidHandle)
{
VERIFY(samplers[i]<m_StateArray.size());
pSS[i] = m_StateArray[samplers[i]].m_pState;
}
}

uiMin = 0;
uiMax = D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT-1;
}

unsure.gif

Короче, идёт вылет из-за кеша, памяти. Что то уже там находится, а движок еще туда пытается затолкать повторно, потому вылетает, скорее всего.

Нужно чистить кеш. Это компилированные шейдеры в оперативе сбоят.

А так на первом заходе на локацию - все зашибись.
Вопрос, как очистить память с новой игрой?
RayTwitty
Zagolski, нужно нормальные диффы, а не вот это вот всё biggrin.gif А то какой-то собери конструктор сам получается, да вот только мало у кого получается. Ты же вроде форвард делаешь, а правки по деффереду вполне можно и в опенсорс репо показывать, имхо.
Zagolski
Цитата(RayTwitty @ 25.05.2020, 01:16) *
Ты же вроде форвард делаешь

Уже перешел на деферред. Форвард себя плохо показал на больших открытых пространствах с кучей геометрии, ведь ее приходится рендерить дважды (первый раз для препасса). А на отложенном сделал только препасс ландшафта и травы, хороший буст дало. Хотя еще ландшафт хочу на карту высот переводить.

Цитата(RayTwitty @ 25.05.2020, 01:16) *
А то какой-то собери конструктор сам получается, да вот только мало у кого получается.

Вроде все по полочкам разложено. Проблема в том, что у меня иначе сделано, дифы ничего не дадут. Это мне нужно садиться за ванильный рендер и делать там. Тогда да. Посмотрим в скором времени.

Цитата(Diesel @ 24.05.2020, 22:16) *
Всё сюда прилетает

Скорее всего прилетает не туда, а строкой выше:
Код
SPass& P = *(S->passes[pass]);

То есть где-то не активирован второй пасс, возвращает NULL и на этом крашится. Не знаю, может у тебя где-то на ландшафте висит шейдер .s, который через луа инициализируется. В этом случае тогда и там нужно сделать два пасса, типа того:

Код
function pass_setup_common_0 (shader, t_base, t_second, t_detail)
    shader    : blend    (false, blend.one, blend.zero)
            : zb    (true,  true)
            : fog    (false)
            
    shader  :dx10color_write_enable( false, false, false, false)
        :dx10stencil    ( true, cmp_func.always, 255, 255, stencil_op.keep, stencil_op.replace, stencil_op.keep )
        :dx10stencil_ref    (1)
end

function pass_setup_common_1 (shader, t_base, t_second, t_detail)
    shader    : blend    (false, blend.one, blend.zero)
            : zb    (true,  false)
            : fog    (false)
            
    shader    :dx10zfunc(cmp_func.equal)

    bla-bla-bla
end

function normal    (shader, t_base, t_second, t_detail)
--    pre_pass --
    shader    :begin    ("bla-bla-bla","bla-bla-bla")
    bla-bla-bla.pass_setup_common_0(shader, t_base, t_second, t_detail)
    
--    main pass --
    shader    :begin    ("bla-bla-bla","bla-bla-bla")
    bla-bla-bla.pass_setup_common_1(shader, t_base, t_second, t_detail)
end

Но тут нет поддержки нормалей. Да и тогда должна сразу падать, а не после релоада. Не знаю, может трабла действительно в дх10, я то с ним не связывался, выпилил сразу как недоделку. Чего и тебе советую. А вообще конечно под дебаггером хорошенько погоняй, проверь. Из-за чего конкретно проблема. И еще проверь сам mapLandscape, может он у тебя не очищается корректно.
Zagolski
Обнаружил, что на локе Припять в ЗП аж 310 секторов. Во дела! Наверное, на каждом здании сделаны, куда внутрь войти можно. Да и не только. Вообще грамотный ход разрабов, все же геометрии довольно много на локе. Но и трудозатраты на их создание наверняка были ого-го. Отчасти теперь понятно, почему ЗП так шустро бегает. Кстати, на болотах ЧН только 1 сектор, который всю локу охватывает.
Diesel
Zagolski, по своему вылету при перезагрузке левела: сейчас проверять свой оригинал буду. Возможно это у меня тянется ранее без этой оптимизации. У меня тут ридер левела новый сделан, как то неважно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.