forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   [TrueHorror] - разработка (http://forum.boolean.name/showthread.php?t=17293)

Mr_F_ 03.03.2015 01:26

Ответ: [TrueHorror] - разработка
 
Цитата:

4) Рисуем квад освещения, пиксельный шейдер проходит только по фрагментам прошедшим тест трафарета
а почему тут ту же сферку не рисовать?

mr.DIMAS 03.03.2015 01:31

Ответ: [TrueHorror] - разработка
 
Возможно кодом будет понятнее о чем я.
Код:

   
for( auto pLight : g_pointLightList ) {
        if( g_camera->frustum.IsSphereInside( pLight->GetRealPosition(), pLight->GetRadius() ) && pLight->IsVisible() ) {
            gpDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0x00000000 );
            gpDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS );
            gpDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_KEEP );

            RenderIcosphereIntoStencilBuffer( pLight );

            mPointLightShader->SetLight( g_camera->invViewProjection, pLight );

            mFullscreenQuad->Bind();       

            gpDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0xFFFFFFFF );
            gpDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_NOTEQUAL );
            gpDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_ZERO );
            // quad render
            mFullscreenQuad->Render();
        }
    }

Сферка жи помечает фрагменты реально попадающие в радиус действия света. Она рисуется только в трафарет.

Mr_F_ 03.03.2015 02:00

Ответ: [TrueHorror] - разработка
 
Рисуй вторую такую же с шейдером света уже, без Z теста, но со стенсил тестом.

mr.DIMAS 03.03.2015 10:45

Ответ: [TrueHorror] - разработка
 
А как тогда быть с текстурными координатами? Они же используются для восстановления позиции по глубине.

Mr_F_ 03.03.2015 10:58

Ответ: [TrueHorror] - разработка
 
ну так генерируешь на сфере такие же экранные координаты.
можешь конечную позицию из VS скопировать в PS, поделить на w и привести из -1 1 в 0 1, или же VPOS юзать.

mr.DIMAS 03.03.2015 19:35

Ответ: [TrueHorror] - разработка
 
Кароч я нашел тормозное место. Это смена шейдеров, для рендера сферки используется простейший шейдер ( трансформация и запись белого цвета ), затем я меняю шейдеры для рендера фулскрин квада и вот эта смена дает тормоза.

Wegox 03.03.2015 20:08

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 293766)
Кароч я нашел тормозное место. Это смена шейдеров, для рендера сферки используется простейший шейдер ( трансформация и запись белого цвета ), затем я меняю шейдеры для рендера фулскрин квада и вот эта смена дает тормоза.

Я тоже.


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

Ещё что-то на первом уровне, память забивает.. тоже после сохранения и загрузки на первом уровне ФПС падает - да так, что лучше начать заново.

mr.DIMAS 03.03.2015 21:35

Ответ: [TrueHorror] - разработка
 
Как можно отсечь источники света полностью загороженные стенкой? Я что-то такое читал про occlusion query но вот не очень в этом разобрался. Че предложите?

Mr_F_ 03.03.2015 21:57

Ответ: [TrueHorror] - разработка
 
Цитата:

occlusion query
забей на него, у него лаг непредсказуемый на несколько кадров, на цпу определяй.

mr.DIMAS 03.03.2015 22:00

Ответ: [TrueHorror] - разработка
 
Подкинешь идей?

Mr_F_ 03.03.2015 22:22

Ответ: [TrueHorror] - разработка
 
ну самое самое тупое - обозначить из какой комнаты (любого конвекса) какую другую видно - не рисовать остальные.
чуть менее тупо - можно поставить порталы (хотя бы в форме прямоугольников), проводить доп фрустум от камеры через рёбра портала и отсекать всё что не попало в соседней комнате.

Samodelkin 04.03.2015 01:30

Ответ: [TrueHorror] - разработка
 
Может вместо смены шейдеров сделать ветвление? Например как это делают для материалов -- записывают индекс материала в гбуффер и затем выполняют нужный для этого материала код из общего шейдера.

Насчёт света: распространение света и теней вещь не предсказуемая. Вот пример, источник света сзади игрока и должен отсекаться, однако вместе с этим и пропадает тень от игрока, которая должна падать впереди игрока и её должно быть видно. Например у тебя при входе в шахту резко меняется освещение потому что отсекается свет идущий от прожектора на входе. Короче я бы лучше отсечение делал более ручным, в редакторе, с помощью дизайнера.

mr.DIMAS 05.03.2015 13:25

Ответ: [TrueHorror] - разработка
 
Цитата:

Может вместо смены шейдеров сделать ветвление? Например как это делают для материалов -- записывают индекс материала в гбуффер и затем выполняют нужный для этого материала код из общего шейдера.
Кароч ветвление делать не нужно. Если убрать запись цвета (gpDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0x00000000 ); ) то пиксельный шейдер не выполняется, следовательно можно не менять пиксельный шейдер( оставить активным шейдер света ) - я понял это исходя из замеров производительности: 70 источников света в кадре без записи цвета при рендере в трафарет - 64 фпс, с записью цвета 28 фпс. Так что одну проблему я убрал, но блин все равно у меня прирост фпс вообще мизерный - 5-7 к\с. Попробую еще рисовать сферку вместо квада, как предложил Mr_F_.

upd. Разве блендинг выполняется для фрагментов не прошедших тест трафарета?

Mr_F_ 05.03.2015 14:10

Ответ: [TrueHorror] - разработка
 
Цитата:

upd. Разве блендинг выполняется для фрагментов не прошедших тест трафарета?
нет, но сами пиксели этим трафаретом надо тестить, что тоже не абсолютно бесплатно.

mr.DIMAS 05.03.2015 14:28

Ответ: [TrueHorror] - разработка
 
Какой-то бред. Если источник света загорожен чем-либо, то по идее ограничивающая сферка не проходит тест глубины и соответственно не проходится тест трафарета, и никакие фрагменты не посылаются на блендинг. Но у меня почему-то это не прокатывает. Блин что я делаю не так?


Часовой пояс GMT +4, время: 14:49.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot