Войти
ФлеймФорумПроЭкты

Angie Engine (5 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#60
20:36, 6 авг. 2020

nes
> Прчитал сначала название темы как ArcticEngine, пробило на холодный пот.

Ты еще как летающие острова прочти, ахахах

#61
(Правка: 13 авг. 2020, 12:56) 21:40, 10 авг. 2020

Добавил в материал pn-triangle tessellation. Описание, что это такое, можно найти тут https://alex.vlachos.com/graphics/CurvedPNTriangles.pdf.
Теперь в материале можно указать тип тесселяции: Flat или PN. Оба типа поддерживают displacement и могут применяться к любой геометрии, в том числе к моделям со скелетной анимацией.
Уровень тесселяции задается узлом материала и глобальным множителем через консольную переменную.
Пока внедрял, пришлось немного повозиться поскольку уперся в максимальное количество varying-векторов в шейдерах тесселяции :)

Пока нет редактора материалов, приходится прописывать ноды и их связи вручную. Ниже приведен пример материала для монстра из Quake:

+ Показать
#62
23:47, 11 авг. 2020

Долго откладывал, наконец дошли руки добавить в материал alpha mask:

+ Показать
#63
21:54, 14 авг. 2020

Продумываю как задавать атрибуты акторам, если требуется вручную отспавнить актор во время игры.

Актор спавнится следующим образом:

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 все атрибуты, включая атрибуты дочерних компонент будут выставлены из скрипта автоматически.

#64
23:06, 14 авг. 2020
SSLR with Doom level

как ты уровень загрузил - парсил или уже что-то готовое в интернете есть?
#65
2:05, 15 авг. 2020

BingoBongo
> как ты уровень загрузил - парсил или уже что-то готовое в интернете есть?

Парсил вручную.

#66
11:17, 15 авг. 2020

0xc0de
> . Первое, что пришло в голову, это сделать как-то так:
> spawnInfo.SetAttribute(
> "{ActorType.StaticMesh}StaticMeshComponent.MeshResource", MyMesh );
фигня какая то
типа давайте изобретем свой язык

#67
(Правка: 14:22) 14:21, 15 авг. 2020

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 );
а атрибуты уже выставляются после спавна.

#68
14:33, 15 авг. 2020

0xc0de
> и вообще нужно ли это
Ты в любом случае можешь добавить это позже. Если ты задумываешься делать или нет - значит не делай. Как появится потребность - добавишь.

Я, во всяком случае, взял такой принцип себе на вооружение ибо иначе ухожу обдумывания и реализацию всякой ненужной хренотени и, по сути, вперед не двигаюсь. Уже года 2 на одном месте сижу...
#69
15:06, 15 авг. 2020

Vlad2001_MFS
> взял такой принцип себе на вооружение
> Уже года 2 на одном месте сижу
не похоже, чтобы помогло )

#70
15:11, 15 авг. 2020

BingoBongo
Так я вот только недавно взял на вооружение, как на Rust перешел)

#71
15:19, 15 авг. 2020

Vlad2001_MFS
по-моему, это обязательное качество всех хороших инженеров - невозможность сопротивляться желанию доводить какую-нибудь фигню до идеального состояния, при том что это фигня в итоге особо и не нужна. забавно, что у многих художников тоже самое.

#72
15:25, 15 авг. 2020

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

Ладно, наверное не стоит тут флудить в теме
#73
(Правка: 1:10) 0:19, 31 авг. 2020

Добавил обводку:

+ Показать

Как сделал:
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-фильтром, но обводка будет с алиасингом. Тут нужно будет применять антиалиасинг или опять же размывать.

#74
(Правка: 21 окт. 2020, 0:42) 23:10, 20 окт. 2020

Обновил гизмо образца 2016 года:

+ Показать
Страницы: 1 2 3 4 5 6 7 Следующая »
ФлеймФорумПроЭкты