Urho3D
GameDev.ru / Сообщества / Urho3D / Форум / Отсечение части объекта. (2 стр)

Отсечение части объекта. (2 стр)

Поделиться
Страницы: 1 2
AlexS32Пользовательwww29 ноя. 201717:22#15
Большое спасибо за помощь. Вроде бы заработало)))
Получилось почти так как  codingmonkey предложил:
<renderpath>
    <command type="clear" color="fog" depth="1.0" stencil="0" />

    <command type="scenepass" pass="cull" />
    <command type="clear" color="fog"/>

    <command type="scenepass" pass="base" vertexlights="true" metadata="base" />
    <command type="forwardlights" pass="light" />
    <command type="scenepass" pass="postopaque" />
    <command type="scenepass" pass="refract">
        <texture unit="environment" name="viewport" />
    </command>
    <command type="scenepass" pass="alpha" vertexlights="true" sort="backtofront" metadata="alpha" />
    <command type="scenepass" pass="postalpha" sort="backtofront" />
</renderpath>

соответственно техника окклюдера:
<technique vs="Unlit" ps="Unlit" vsdefines="NOUV" >
    <pass name="cull"/>
</technique> 
техника зеленого объекта DiffAlpha, техника экрана:
<technique vs="LitSolid" ps="LitSolid" psdefines="DIFFMAP">
    <pass name="alpha" depthwrite="false" depthtest="always" blend="alpha" />
    <pass name="litalpha" depthwrite="false" depthtest="always" blend="addalpha" />
</technique>
Кстати в связи с последней техникой возник вопрос - pass "litalpha" в рендерпасе не указан, но отрабатывается. С чем это связано?
И для чего нужны в моделе параметры "Is occluder" и "Can be occluded"? У меня так и не получилось смоделировать ситуацию, когда они на что-то влияют.
codingmonkeyПостоялецwww29 ноя. 201719:20#16
>Вроде бы заработало)))
круто)

>"litalpha" в рендерпасе не указан, но отрабатывается. С чем это связано?
Это типо сопутствующий alpha-пассу - суб-пасс (как и lit+base). Он не выносится в RP движек просто чекает технику.

        // If no lit pass, check for lit alpha
        if (!destBatch.pass_)
        {
            destBatch.pass_ = tech->GetSupportedPass(litAlphaPassIndex_);
            isLitAlpha = true;
        }

далее альфа раскидывается по очередям на прорисовку (с лампочками или без)

Is occluder - это окклюдер, н/р здания,стены, горы, короче что-то большое, их не должно быть слишком много в кадре, bbox такого объекта рисует софтварно(CPU) в мелкий occlusionbuffer
и потом все объекты помеченные "Can be occluded" проверяются не перекрыты ли они чем либо.

>У меня так и не получилось смоделировать ситуацию, когда они на что-то влияют.
загрузи сцену с логотипом Ухи и с тремя кубиками в редакторе
в материале у логотипа чекни опцию "occlusion", у кубиков поставь "Can be occluded", затем покрути камеру вокруг логотипа (возможно лого придется несколько увеличить, что бы оно своим BBox перекрывало BB кубиков), должно все работать

AlexS32Пользовательwww29 ноя. 201722:03#17
> загрузи сцену с логотипом Ухи и с тремя кубиками в редакторе
> в материале у логотипа чекни опцию "occlusion", у кубиков поставь "Can be
> occluded", затем покрути камеру вокруг логотипа (возможно лого придется
> несколько увеличить, что бы оно своим BBox перекрывало BB кубиков), должно все
> работать
Обязательно проверю :) Но для меня сейчас более важен другой вопрос - почему при описанной выше системе при замене техники зеленого объекта с DiffAlpha на Diff он перестает отображаться.
Это находится в зависимости с depthtest="always" в технике экрана. Если depthtest оставить по умолчанию, то объект рисуется, но окклюдер вырезает экран. Если же поставить depthtest="greater" то экран рисуется только на окклюдере.

Все кажется разобрался. Как я понял из-за того, что техника Diff основана на пассе base, а DiffAlpha на пассе Alpha необходимо было вначале выполнить Alpha без записи в буфер глубины, а потом уже base выполнять.

Правка: 30 ноя. 2017 17:48

Страницы: 1 2

/ Форум / Urho3D - игровой движок / ЗАДАВАЙТЕ ВОПРОСЫ

2001—2017 © GameDev.ru — Разработка игр