![]() |
Ответ: [TrueHorror] - разработка
Цитата:
Например на дневной локации будет только один источник света - солнце. Те же пещеры (то что я замечал), делают с учётом того что бы в одной части не больше 2-3 источников, остальное скрыто. То бишь из просторной пещеры вошёл в "кишку", дальше опять большое пространство. В каждой такой части и будет не больше 2-3 источников. Свет активен только в той части где игрок, + совмещают с картами освещённости. И ещё дизайн локации, то есть две части пещеры не на одной линии, что бы из одной части нельзя было видеть что в следующей. По большей части это мои предположения. |
Ответ: [TrueHorror] - разработка
Народ ну чё за ботва. Подкиньте идеек по оптимизации.
|
Ответ: [TrueHorror] - разработка
Куча лайтов с пересекающейся зоной влияния - много овердро. Куча отдельных маленьких - должно норм пахать. А, Ну дак у тебя на каждый лайт фулскрин квад рисуется! Надо кваду ограничивать зону влияния, иначе тут в любом случае жутчайший овердро. Известные способы (не мешающие друг другу): 1. Рисовать не фулскрин квад, а квад поменьше, в который вписывается зона влияния лайта. Часто лайты не влияют на весь экран. 2. Рисовать грубый меш по форме зоны влияния лайта (лоуполи сферу для поинта, конус для спота). Рисовать его только в стенсил (не в глубину, не в цвет). Юзать настройки стенсила, как со стенсильными тенями в Depth Fail методе (2 раза не надо только волум рисовать, есть хардварный two-sided stencil): http://en.wikipedia.org/wiki/Shadow_volume Это даст тебе помеченные в стенсиле пиксели, куда влияет лайт (где он пересекается со сценой). Дальше рисуешь экранный квад, но настраиваешь стенсил так, чтобы он проявлялся только в помеченых волумом местах. Стенсил тест идёт до выполнения шейдеров. Это точнее, чем вариант 1, который не учитывает пересечение с збуфером, но вариант 1 тоже не помешает, чтобы сократить число пикселей квада, тестящих стенсил. --- По мелочам из кода: Цитата:
Цитата:
SetVertexShaderConstantF SetPixelShaderConstantF необязательно по имени брать константы из шейдера, можно замаппить их напрямую в нужные регистры типа const float4x4 MatWorldViewProj : register(c0); const float4x4 MatWorld : register(c4); с# - номера констант, они измеряются в float4, это нативный формат видюшной константы (на самом деле флоаты и флоаты2/3, это все равно неполные флоаты4 или их части). Но если у тебя там не тысячи объектов, это всё мелочи - просто так удобнее, быстрее, контроллируемее, имхо. |
Ответ: [TrueHorror] - разработка
Спасибо ОГРОМНОЕ! Как сделаю, так сразу отпишусь о результате.
|
Ответ: [TrueHorror] - разработка
Вложений: 5
Раньше никогда не работал с буфером трафарета и вот наткнулся на грабли. Вроде все работает как надо - да вот только когда попадаешь в несколько ограничивающих сфер сразу( у меня точечные источники света ) - фпс падает в 2 раза. Причем если источники стоят не пересекаясь между собой - то все норм - фпс 60 ( при разрешении 2560х1440 ). Все норм и при взгляде на всю сцену.
Гляньте код( особенно где трафарет настраивается ) - Mr_F_ я взываю к тебе :-D http://pastebin.com/FxUaau8D Демка в аттаче - 60 источников света. Комменты к скринам: 1 - камера в нескольких ограничивающих сферах одновременно. 2 - там же, взгляд в пол. 3 - вся сцена из далека. 4 - в сцене между источниками света( не попадаю ни в одну ограничивающую сферу ) |
Ответ: [TrueHorror] - разработка
Цитата:
Цитата:
Вместо этого, когда рисуешь обрезаемый стенсилом квад с шейдингом лайта, ставь ему STENCILPASS = D3DSTENCILOP_ZERO, он тогда автоматически собой затрёт только в нужном месте. Цитата:
Так ты мог и без стенсила обойтись, а сразу рисовать шарик с шейдером лайта. А идея со стенсилом в том, чтобы пометить только пиксели, с которыми соприкасается (!) шарик. В которые он въехал. Где intersection с z-буфером. Тогда неважно, если ты внутри шарика. По сути задача получить реальную 1-битную маску конкретно освещения от лайта. Могу перепутать что-то местами (incr/decr), но вроде суть такова (псевдокод): TwoSidedStencilMode = TRUE CullMode = None StencilFunc = Always StencilZFail = D3DSTENCILOP_DECR CCW_StencilFunc = Always CCW_StencilZFail = D3DSTENCILOP_INCR Представь, что рисуешь шарик, нанизанный на столб. Где внутри шарика не виден столб - там за фронтфейсами всегда видны бекфейсы. Где фронтфейсы и бекфейсы не пересекаются с тем, что в збуфере - ничего не меняется (ZFail не вызывается). Где и те и другие где-то под землёй/в стене - одни делают +1, другие -1, ничего не меняется. А вот там, где у тебя в шарике столб, только бекфейсы вызовут ZFail, в результате столб внутри шара пометится чем-то отличным от 0. Дальше рисуешь квад с шейдингом лайта с StencilFunc = NotEqual нулю, получается только этот столб осветится, а не целый шар на экране. |
Ответ: [TrueHorror] - разработка
Тоесть Z-буфер не очищать после первого прохода, только запрещать в него запись. Затем для каждого источника света рисовать шарик и проверять, где он не прошел тест глубины, тогда получим силуэт реально освещенной части объекта, находящийся в буфере трафарета. А затем уже рисуем экранный квад с отсечением по трафарету. Так?
|
Ответ: [TrueHorror] - разработка
|
Ответ: [TrueHorror] - разработка
Вложений: 1
Цитата:
Вот код http://pastebin.com/3x732dwj Работает все очень шустро - в любом месте 60 фпс. Демка в аттаче ( 60 источников света ) 2Mr_F_ Просто огромное спасибо за разъяснения. То чувство, когда пришло прозрение. |
Ответ: [TrueHorror] - разработка
Цитата:
Цитата:
для дебага можно тупо один цвет вывести в шейдере лайта - сразу будет видно на каких пикселях считается лайт, убедиться что всё как надо. |
Ответ: [TrueHorror] - разработка
Вложений: 1
Цитата:
|
Ответ: [TrueHorror] - разработка
хочу просто сказать, что после закрытия приложения выходит ошибка:
![]() |
Ответ: [TrueHorror] - разработка
Хех , 60фпс , а как такого эффекта добиться ?
С моим деферредом 60 фпс при 10 светильниках :( |
Ответ: [TrueHorror] - разработка
на самом деле способ со стенсилом ещё далеко не самый быстрый ;)
на directcompute можно ещё круче наворотить (чем сейчас и занимаюсь) |
Ответ: [TrueHorror] - разработка
Как я понимаю там сферы рендерятся ?
|
Часовой пояс GMT +4, время: 14:49. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot