nes
> Прчитал сначала название темы как ArcticEngine, пробило на холодный пот.
Ты еще как летающие острова прочти, ахахах
Добавил в материал pn-triangle tessellation. Описание, что это такое, можно найти тут https://alex.vlachos.com/graphics/CurvedPNTriangles.pdf.
Теперь в материале можно указать тип тесселяции: Flat или PN. Оба типа поддерживают displacement и могут применяться к любой геометрии, в том числе к моделям со скелетной анимацией.
Уровень тесселяции задается узлом материала и глобальным множителем через консольную переменную.
Пока внедрял, пришлось немного повозиться поскольку уперся в максимальное количество varying-векторов в шейдерах тесселяции :)
Пока нет редактора материалов, приходится прописывать ноды и их связи вручную. Ниже приведен пример материала для монстра из Quake:
Долго откладывал, наконец дошли руки добавить в материал alpha mask:
Продумываю как задавать атрибуты акторам, если требуется вручную отспавнить актор во время игры.
Актор спавнится следующим образом:
TActorSpawnInfo< ActorType > spawnInfo; spawnInfo.SpawnTransform.Position = Float3(x,y,z); ActorType * actor = world->SpawnActor( spawnInfo );
У актора могут быть внутренние атрибуты, например MaxHealth. Планирую задавать их так:
spawnInfo.SetAttribute("ActorType.MaxHealth", 100.0f );
Это значит, что актор заспавнится с предустановленным значением здоровья 100.
Поскольку акторы могут наследоваться друг от друга, то чтобы не было конфликта имен атрибутов вместе с именем атрибута указывается ActorType.
Помимо примитивных типов могут быть также атрибуты в виде объектов, например:
spawnInfo.SetAttribute("AudioSource.AudioClip", AudioClip );
где AudioClip - объект, представляющий аудио ресурс.
Следующий шаг - дать возможность задавать атрибуты для дочерних объектов (компонент) актора.
Например у актора есть компонент StaticMesh и нам нужно задать мешу ресурс. Первое, что пришло в голову, это сделать как-то так:
spawnInfo.SetAttribute("{ActorType.StaticMesh}StaticMeshComponent.MeshResource", MyMesh );
Здесь в фигурных скобках задается имя атрибута у актора "StaticMesh", у которого есть атрибут "MeshResource", которому будет присвоен ресурс MyMesh. Для примера структура класса выглядит так (псевдокод):
class ActorType { [attribute] Ptr<StaticMeshComponent> StaticMesh; }; class StaticMeshComponent { [attribute] Ptr<IndexedMesh> MeshResource; }
Таким образом можно задать атрибуты для вложенных объектов:
spawnInfo.SetAttribute("{{class_a.attrib_a}class_b.attrib_b}class_c.attrib_c", value );
Что думаете по поводу такой схемы? И нужно ли вообще задавать атрибуты внутри атрибутов при спавне актора, а ограничиться только атрибутами самого актора?
Это про ручной спавн акторов во время игры, где с помощью кода нужно указать параметры спавна.
В другой ситуации - при загрузке актора из скрипта аля json все атрибуты, включая атрибуты дочерних компонент будут выставлены из скрипта автоматически.
SSLR with Doom level
как ты уровень загрузил - парсил или уже что-то готовое в интернете есть?
BingoBongo
> как ты уровень загрузил - парсил или уже что-то готовое в интернете есть?
Парсил вручную.
0xc0de
> . Первое, что пришло в голову, это сделать как-то так:
> spawnInfo.SetAttribute(
> "{ActorType.StaticMesh}StaticMeshComponent.MeshResource", MyMesh );
фигня какая то
типа давайте изобретем свой язык
forwhile
> типа давайте изобретем свой язык
Вопрос скорее в том, как задать атрибуты объекта до его спавна в рантайме и вообще нужно ли это.
В Unity3D например спавн объекта делается через ф-ию Instantiate:
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);
что является аналогом моей SpawnActor:
template< typename T >
T * SpawnActor( TActorSpawnInfo< T > const & SpawnInfo );
а атрибуты уже выставляются после спавна.
0xc0de
> и вообще нужно ли это
Ты в любом случае можешь добавить это позже. Если ты задумываешься делать или нет - значит не делай. Как появится потребность - добавишь.
Я, во всяком случае, взял такой принцип себе на вооружение ибо иначе ухожу обдумывания и реализацию всякой ненужной хренотени и, по сути, вперед не двигаюсь. Уже года 2 на одном месте сижу...
Vlad2001_MFS
> взял такой принцип себе на вооружение
> Уже года 2 на одном месте сижу
не похоже, чтобы помогло )
BingoBongo
Так я вот только недавно взял на вооружение, как на Rust перешел)
Vlad2001_MFS
по-моему, это обязательное качество всех хороших инженеров - невозможность сопротивляться желанию доводить какую-нибудь фигню до идеального состояния, при том что это фигня в итоге особо и не нужна. забавно, что у многих художников тоже самое.
BingoBongo
> это обязательное качество всех хороших инженеров - невозможность сопротивляться
> желанию доводить какую-нибудь фигню до идеального состояния, при том что это
> фигня в итоге особо и не нужна.
Все хорошо в меру. Вот переписывал я постоянно движок свой и чего в этом хорошего, если он так и оставался застывшим на какой-либо ступени развития? Когда можно было бы забить на некоторые вещи и добавлять всякие новые интересности в движок.
Ладно, наверное не стоит тут флудить в теме
Добавил обводку:
Как сделал:
1. Заводим текстуру R8G8 и очищаем ее цветом R=0,G=1
2. Рендерим в нее меши, требующие обводки, записывая в R=1,G=0
3. Делаем gaussian blur по горизонтали, записываем результат во вторую текстуру такого же формата (R8G8)
4. Рендерим с альфаблендингом полноэкранный квад, где rgb - цвет обводки, a - контур, который считается следующим образом:
4.1 В этом же проходе считываем размытую по горизонтали текстуру и размываем ее по вертикали, полученное значение записываем в vec2 finalBlur.
4.2 Вычитаем из заблюренной маски исходную из пункта 2:
outline = saturate( finalBlur - texture( mask, tc ).rg );
4.3 Итоговое значение альфы считаем, как сумму r+g:
alpha = saturate( (outline.x + outline.y) * Hardness )
где hardness - некий коэффициент, влияющий на четкость обводки
Пункт 4 можно делать с аддитивным блендингом, тогда обводка приобретает эффект свечения. В этом случае цвет обводки умножается на alpha, а в alpha-канал записывается 1.
Можно обойтись двумя R8 текстурами, но тогда внутренняя часть контура будет четкой, а внешняя размытой.
Можно вообще не блюрить, а обойтись одной R8 текстурой, а контур получить sobel-фильтром, но обводка будет с алиасингом. Тут нужно будет применять антиалиасинг или опять же размывать.
Обновил гизмо образца 2016 года: