|
03.03.2015, 01:26
|
#811
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
4) Рисуем квад освещения, пиксельный шейдер проходит только по фрагментам прошедшим тест трафарета
|
а почему тут ту же сферку не рисовать?
|
(Offline)
|
|
03.03.2015, 01:31
|
#812
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [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();
}
}
Сферка жи помечает фрагменты реально попадающие в радиус действия света. Она рисуется только в трафарет.
__________________
|
(Offline)
|
|
03.03.2015, 02:00
|
#813
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
Рисуй вторую такую же с шейдером света уже, без Z теста, но со стенсил тестом.
|
(Offline)
|
|
03.03.2015, 10:45
|
#814
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
А как тогда быть с текстурными координатами? Они же используются для восстановления позиции по глубине.
__________________
|
(Offline)
|
|
03.03.2015, 10:58
|
#815
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
ну так генерируешь на сфере такие же экранные координаты.
можешь конечную позицию из VS скопировать в PS, поделить на w и привести из -1 1 в 0 1, или же VPOS юзать.
|
(Offline)
|
|
03.03.2015, 19:35
|
#816
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Кароч я нашел тормозное место. Это смена шейдеров, для рендера сферки используется простейший шейдер ( трансформация и запись белого цвета ), затем я меняю шейдеры для рендера фулскрин квада и вот эта смена дает тормоза.
__________________
|
(Offline)
|
|
03.03.2015, 20:08
|
#817
|
Бывалый
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений (для 1,133 пользователей)
|
Ответ: [TrueHorror] - разработка
Сообщение от mr.DIMAS
Кароч я нашел тормозное место. Это смена шейдеров, для рендера сферки используется простейший шейдер ( трансформация и запись белого цвета ), затем я меняю шейдеры для рендера фулскрин квада и вот эта смена дает тормоза.
|
Я тоже.
Там у тебя не все партиклы удаляются, после загрузки с третьего уровня на второй - это видно, скорее всего это тот что обжигает.
Ещё что-то на первом уровне, память забивает.. тоже после сохранения и загрузки на первом уровне ФПС падает - да так, что лучше начать заново.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.03.2015, 21:35
|
#818
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Как можно отсечь источники света полностью загороженные стенкой? Я что-то такое читал про occlusion query но вот не очень в этом разобрался. Че предложите?
__________________
|
(Offline)
|
|
03.03.2015, 21:57
|
#819
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
забей на него, у него лаг непредсказуемый на несколько кадров, на цпу определяй.
|
(Offline)
|
|
03.03.2015, 22:00
|
#820
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Подкинешь идей?
__________________
|
(Offline)
|
|
03.03.2015, 22:22
|
#821
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
ну самое самое тупое - обозначить из какой комнаты (любого конвекса) какую другую видно - не рисовать остальные.
чуть менее тупо - можно поставить порталы (хотя бы в форме прямоугольников), проводить доп фрустум от камеры через рёбра портала и отсекать всё что не попало в соседней комнате.
|
(Offline)
|
|
04.03.2015, 01:30
|
#822
|
Мастер
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений (для 631 пользователей)
|
Ответ: [TrueHorror] - разработка
Может вместо смены шейдеров сделать ветвление? Например как это делают для материалов -- записывают индекс материала в гбуффер и затем выполняют нужный для этого материала код из общего шейдера.
Насчёт света: распространение света и теней вещь не предсказуемая. Вот пример, источник света сзади игрока и должен отсекаться, однако вместе с этим и пропадает тень от игрока, которая должна падать впереди игрока и её должно быть видно. Например у тебя при входе в шахту резко меняется освещение потому что отсекается свет идущий от прожектора на входе. Короче я бы лучше отсечение делал более ручным, в редакторе, с помощью дизайнера.
|
(Offline)
|
|
05.03.2015, 13:25
|
#823
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Может вместо смены шейдеров сделать ветвление? Например как это делают для материалов -- записывают индекс материала в гбуффер и затем выполняют нужный для этого материала код из общего шейдера.
|
Кароч ветвление делать не нужно. Если убрать запись цвета (gpDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0x00000000 ); ) то пиксельный шейдер не выполняется, следовательно можно не менять пиксельный шейдер( оставить активным шейдер света ) - я понял это исходя из замеров производительности: 70 источников света в кадре без записи цвета при рендере в трафарет - 64 фпс, с записью цвета 28 фпс. Так что одну проблему я убрал, но блин все равно у меня прирост фпс вообще мизерный - 5-7 к\с. Попробую еще рисовать сферку вместо квада, как предложил Mr_F_.
upd. Разве блендинг выполняется для фрагментов не прошедших тест трафарета?
__________________
|
(Offline)
|
|
05.03.2015, 14:10
|
#824
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: [TrueHorror] - разработка
upd. Разве блендинг выполняется для фрагментов не прошедших тест трафарета?
|
нет, но сами пиксели этим трафаретом надо тестить, что тоже не абсолютно бесплатно.
|
(Offline)
|
|
05.03.2015, 14:28
|
#825
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: [TrueHorror] - разработка
Какой-то бред. Если источник света загорожен чем-либо, то по идее ограничивающая сферка не проходит тест глубины и соответственно не проходится тест трафарета, и никакие фрагменты не посылаются на блендинг. Но у меня почему-то это не прокатывает. Блин что я делаю не так?
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:51.
|