Войти
Urho3DФорумЗАДАВАЙТЕ ВОПРОСЫ

[АРХИВ] Шейдеры, техники, rendering path'ы (4 стр)

Страницы: 13 4 5 624 Следующая »
#45
22:52, 4 дек. 2015

radio
> но пока в голове не укладывается
> почему при почти одинаковых мс такая разница фпс.
математика ;)
фпс и время кадра связаны обратной зависимостью.


#46
22:58, 7 дек. 2015

Поправил немного SoftPartcles:
+ Вывел два юниформа в материал (FadeScale + FadeContrastPower) которые идут по доке от NV
+ Поправил RenderPath для Forward/Deferred(они на самом деле могут и в обычном alpha pass'e рисоваться, и как я понял для Lit- шейдера SoftParticles просто необходимо там рисовать иначе не освещается ничего :) )
+ Lit шейдер
+ И поправил имхо самое главное прозрачность в месте контакта с solid геометрией
-  С тенями какой-то косяк был (шейдер теней от партиклов пока не запушил)

https://github.com/MonkeyFirst/Urho3DSoftParticles/tree/SoftParticlesFix1

#47
23:35, 7 дек. 2015

Замержил) А что дают эти два юниформа? Там всякие возведение в степень вместо обычного вычитания

#48
23:40, 7 дек. 2015

я там кстати в шейдере дополнительный параметр сделал в случае, когда используется blend="add"
и еще все созданные файлы помещены в папку MyData, чтобы было легко найти и не путать со стандартными файлами ухи

#49
0:06, 8 дек. 2015

>А что дают эти два юниформа? Там всякие возведение в степень вместо обычного вычитания
google: soft particels NV whitepaper
(Первая ссылка на доку)

Эти два параметра дают красивые градации на границах solid<>soft ну и управление ими )
Изображение

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


>Думаю нужная вещь
Точно очень нужная так как другие более мелкие эффекты могут использовать эту особенность софт партиклов.

#50
0:19, 8 дек. 2015

Надо будет визуально затестить различие с градиентом и без) Просто у меня даже при простом шейдере, когда партикл на весь экран дико фпс проседает

#51
0:47, 8 дек. 2015

Есть ли способ из шейдера узнать какой способ блендинга используется в материале? При смешивании blend="alpha" нам нужно модифицировать цвет, а не альфу. ПРосто я приделал костыль, передающий тип смешивания в шейдер, но что-то меня терзают смутные сомнения

#52
1:10, 8 дек. 2015

>Просто у меня даже при простом шейдере, когда партикл на весь экран дико фпс проседает
ну так филл рейт просаживается
можно попытаться еще вообще их отдельно рендерить в специльную мелкую текстуру(в 2 или 4 раза меньше фрейма) и потом мешать с основным кадром.

>Есть ли способ из шейдера узнать какой способ блендинга используется в материале?
+ Ну самый очевидный имхо передать юниформ который как-то далее трактовать в шейдере.
+ Потом как вариант сделать два разных шейдера это вроде лучше чем городить IF'ы в шейдере
в технике добавляешь PS/VS дефайны, = vsdefines="VERTEXCOLOR SOFTPARTICLES" psdefines="MYBLEND DIFFMAP HWDEPTH VERTEXCOLOR SOFTPARTICLES">
И да сколько вариаций дефайнов будет сколько техник :) + сам рендерер еще свои дефайны пихает при компиляции: типо (PERPIXEL и еже с ним...)

>При смешивании blend="alpha" нам нужно модифицировать цвет, а не альфу.
почемуй-та? сроду думал что именно альфу нужно крутить в 0 где коллизия. Ты уже пробовал цвет только менять, как это выглядит ?


#53
1:18, 8 дек. 2015

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

я опечатался, там blend="add"

#54
2:38, 8 дек. 2015

Вообще при желании можно выкинуть один из проходов в lit-технике(SoftParticlesDiffVColAlpha) либо litalpha либо саму alpha тем самым получить некоторый прирост фпс.
правда в случае одной лишь alpha получаем не освещаемые партиклы (как и с обычным unlit софт-шейдером)
а в случае одной лишь litalpha в технике видим только те партиклы до которых достает какая-либо лампочка, вне радиуса света партиклы исчезают.

+ Показать

std

<technique vs="SoftParticlesLit" ps="SoftParticlesLit" vsdefines="VERTEXCOLOR SOFTPARTICLES" psdefines="DIFFMAP HWDEPTH VERTEXCOLOR SOFTPARTICLES">
    <pass name="alpha" depthtest="always" depthwrite="false" blend="alpha" />
    <pass name="litalpha" depthtest="always" depthwrite="false" blend="addalpha" />
</technique>

lit only

<technique vs="SoftParticlesLit" ps="SoftParticlesLit" vsdefines="VERTEXCOLOR SOFTPARTICLES" psdefines="DIFFMAP HWDEPTH VERTEXCOLOR SOFTPARTICLES">
    <pass name="litalpha" depthtest="always" depthwrite="false" blend="addalpha" />
</technique>

lit only 2

<technique vs="SoftParticlesLit" ps="SoftParticlesLit" vsdefines="VERTEXCOLOR SOFTPARTICLES" psdefines="DIFFMAP HWDEPTH VERTEXCOLOR SOFTPARTICLES">
    <pass name="litalpha" depthtest="always" depthwrite="false" blend="alpha" />
</technique>

#55
3:32, 8 дек. 2015

насколько я понял из кода, пассы которые начинаются на lit (например litbase)  - это специальные оптимизирующие команды, их даже в RenderPath прописывать  не нужно. Конкретно litalpha не смотрел, но litbase вызывается только по мере надобности и заменяет собой базовый проход + проход для одного источника света (то есть объединяет два прохода в один), так что смело используй, лишнего проседания фпс без надобности не будет

#56
7:29, 8 дек. 2015

Неплохо бы еще сделать чтобы партиклы плавно затухали возле камеры, точнее возле передней плоскости отсечения.

#57
10:23, 8 дек. 2015

>насколько я понял из кода, пассы которые начинаются на lit (например litbase) - это специальные оптимизирующие команды, их даже в RenderPath прописывать не нужно
да просто возьми удали одну из них в технике и посмотри на результат

>Конкретно litalpha не смотрел
Мне кажется что с альфой не работает эта оптимизация, хотя в к код не смотрел. И мы имеем два тяжелых прохода с кучей слоеной альфа геометрии(дикая просадка филлрейта) один без света другой со светом.

>Неплохо бы еще сделать чтобы партиклы плавно затухали возле камеры, точнее возле передней плоскости отсечения.
надо будет попробовать, но это наверное как минимум операцию ветвления городить в шейдере (но вроде бы GPU в этом случае вычисляет две ветки и затем одну из низ них откидывает по маске выполнения условия ?)


небольшая оптимизация RenderPath (правда с косяком по границам, наверное нужно блюр добавить)

Изображение

SPFast

+ Показать

SPFast+Blur

+ Показать

У меня если обычный ForwardHWDepthSP показывает 315 fps то FastBlur версия 385 fps (при одном и том же ракурсе камеры)

#58
10:46, 8 дек. 2015

> да просто возьми удали одну из них в технике и посмотри на результат

litbase удалял )
и даже исходник ковырял) выяснял почему его можно безопасно удалять и при это отключатеся оптимизация. оно вот так работает:

оптимизация используется только если
1. вообще существует проход litbase в материале
2. для первого источника света (исчтоники света предварительно сортируюся в порядке силы влияния)
3. не освещен вертексными источниками света (то есть если освещен только исчтониками с попиксельным освещением)
4. зона не имеет градиента

    bool allowLitBase =
        useLitBase_ && !lightQueue.negative_ && light == drawable->GetFirstLight() && drawable->GetVertexLights().Empty() &&
        !zone->GetAmbientGradient();

базовый проход (тот который обеспечивает фоновое освещение объекта и освещение вершинными источниками света) отбрасывается, если были пройдены все условия для активации litbase

                // Skip forward base pass if the corresponding litbase pass already exists
                if (info.passIndex_ == basePassIndex_ && j < 32 && drawable->HasBasePass(j))
                    continue;

Проход litbase определяет дефайн AMBIENT (смотри любой litbase в техниках)

<pass name="litbase" psdefines="AMBIENT" />

А вот как оно используется в шейдере

    #if defined(PERPIXEL) // для первого попиксельного источника света

        ...

        #ifdef AMBIENT // если включена оптимизация
            finalColor += cAmbientColor * diffColor.rgb; // накладываем фоновое освещение
            finalColor += cMatEmissiveColor;
            gl_FragColor = vec4(GetFog(finalColor, fogFactor), diffColor.a);
        #else 
            gl_FragColor = vec4(GetLitFog(finalColor, fogFactor), diffColor.a);
        #endif

Так что поддержка оптимизации в самом шейдере должна быть тоже. Код Lialpha я подобным образом не разбирал, но может быть там тоже нужно в шейдере все правильно организовать, если эта оптимизация для прозрачных объектов вообще есть. Хотя я не исключаю того, что эта оптимизация только для непрозрачной геометрии.

#59
13:00, 8 дек. 2015

AMBIENT- указывает то что нужно просчитать амбиент для текущего пикселя

        #ifdef AMBIENT
            finalColor += cAmbientColor * diffColor.rgb;

cAmbientColor - берется из Zone которая влияет на данный объект

extern URHO3D_API const StringHash PSP_AMBIENTCOLOR("AmbientColor");

void Batch::Prepare(View* view, Camera* camera, bool setModelTransform, bool allowDepthWrite) const
graphics->SetShaderParameter(PSP_AMBIENTCOLOR, zone_->GetAmbientColor());

я добавил AMBIENT к litalpha она не реагирует на зону вообще ни с ней ни без неё.
<pass name="litalpha" psdefines="AMBIENT" depthtest="always" depthwrite="false" blend="addalpha" />

а вот
    <pass name="alpha" depthtest="always" depthwrite="false" blend="alpha" />

регирует на Zone (ее амбиент)
но опять же psdefines="AMBIENT ей не нужно даже прописывать она и так реагирует.
сдается мне это те автоматические дефайны которые движок сам пушит в шейдер в зависимости какое у шейдера окружение имеет объект, в PERPIXEL просто прописаны эти доп. элементы возможного окружения.

    #if defined(PERPIXEL) 
        // Per-pixel forward lighting

    #elif defined(PREPASS)
        // Fill light pre-pass G-Buffer

    #elif defined(DEFERRED)
        // Fill deferred G-buffer

    #else
        // Ambient & per-vertex lighting

    #endif


например:
1. объект рисуется рядом с лампочкой -> двиг пушит PERPIXEL в шейдер получает вариацию с лампочкой
2. объект рисуется рядом с лампочкой и объект находиться в zone -> двиг пушит PERPIXEL+AMBIENT в шейдер получает вариацию с лампочкой и амбиентом
3. объект рисуется рядом с лампочкой(спот лайт) и объект находиться в zone -> двиг пушит PERPIXEL+AMBIENT+SPOTLIGHT в шейдер получает вариацию с спотлайтом и амбиентом


Страницы: 13 4 5 624 Следующая »
Urho3DФорумЗАДАВАЙТЕ ВОПРОСЫ

Тема в архиве.