Последнее время активно работаю над движком для Crunch House. Пока занимаюсь всякими техническими штуками: Deferred Shading, MSAA, Тени. В планах как минимум ещё TAA, Motion Blur, Bloom, SSAO, SSR. Возможно, для виртуального мира игры эти настройки нужно будет разблокировать по мере улучшения движка, который надо будет создавать в самой игре.
Дошёл вот до создания персонажей. Референс это в первую очередь RimWorld и Prison Architect, но скрещенный с Portal Bridge Construction. То есть я хочу такие же простые 2D-силуэты, но реально торчащие в 3D, с некоторой толщиной и отбрасывающие корректные тени.
Думаю, какой подход подойдёт лучше: либо генерить настоящую геометрию, либо квад с Alpha-To-Coverage.
Настоящая геометрия хорошо подходит для создания туловища, круглой головы и рук. Но вот для всяких пропсов и причёсок генерировать геометрию из изображения не так удобно. Квад с прозрачностью, конечно, сильно проще, но тогда сложнее сделать нормальную толщину. Что думаете?
Дошёл вот до создания персонажей. Референс это в первую очередь RimWorld и Prison Architect, но скрещенный с Portal Bridge Construction. То есть я хочу такие же простые 2D-силуэты, но реально торчащие в 3D, с некоторой толщиной и отбрасывающие корректные тени.
Думаю, какой подход подойдёт лучше: либо генерить настоящую геометрию, либо квад с Alpha-To-Coverage.
Настоящая геометрия хорошо подходит для создания туловища, круглой головы и рук. Но вот для всяких пропсов и причёсок генерировать геометрию из изображения не так удобно. Квад с прозрачностью, конечно, сильно проще, но тогда сложнее сделать нормальную толщину. Что думаете?
Тяжёлые выборы #2
С днём, когда моё MS-бойство серьёзно пошатнулось.
Несмотря на то, что я сейчас пишу исключительно под винду и только на DirectX12, я в итоге перешёл во многом на OpenGL конвенции: Right-handed координаты и Bottom-left текстуры.
Да-да, это ещё один пост про чёртовы оси, и я их снова изменил.
Во всех бедах я по-прежнему продолжаю винить Сильвестра Лакруа и прочих составителей учебников по математике 18 века, повадившихся рисовать ось «Y» вверх. Именно они обрекли многие поколения школьников на страдания, всякий раз когда им требуется теперь отступить место для графика в школьной тетрадке.
А ведь у них была историческая возможность развернуть «Y» вниз, и тогда бы это удобно встраивалось в европейское письмо слева-направо и сверху-вниз (а положительные углы шли бы по часовой стрелке). А ведь направление письма сверху-вниз определило ещё и направление скроллинга страницы, и направление обновления монитора, а это, в свою очередь, повлияло и на систему координат большинства графических редакторов и файловых форматов.
Но увы. Они решили направить ось ординат наверх, и это во многом предопределило разброд и шатание по вертикале между DX и GL, между GUI и World Space.
Моя приверженность левосторонней системе координат и TopLeft-текстурам произрастала из приоритета консистентности над математичностью. Мне важно, чтобы мировые координаты росли туда же, куда и текстурные. И чтобы «X» вёл себя точно так же, как и «Y»: нет ничего более раздражающего, чем флип только одного компонента. А поскольку координаты графических редакторов (Paint, Photoshop) это своего рода данность, то я подсознательно выстраивал всё остальное под них.
И до поры до времени я был готов мириться с тем, что это нематематично: ну, подумаешь, повороты в игре будут идти в другую сторону. Задокументировать и забыть. Но я сдался на утилитах для 2D геометрии. Функции типа «площадь под кривой» или «IsClockwise» для многоугольника обычно предполагают, что мы смотрим на оси как принято в математике. Но если в моём движке большую часть времени мы смотрим на оси с обратной стороны (X — вправо, Y — вниз), то либо надо функции переименовывать, либо всегда держать в голове, что их значения перевёрнуты для геймплея. И всегда нужно помнить, где именно инвертировано внутри, а где — предполагается инвертировать на выходе. Это просто невозможный оверхед, который непременно приведёт к путанице, и к тому, что ты сам в какой-то момент перестанешь доверять названиям собственных функций.
Масла в огонь добавило то, что большинство DCC экспортят увишку по умолчанию как Bottom-Left и то же самое предполагает MikkTSpace — по сути стандарт тангент-спейса.
И тут я снова задумался: а такая уж ли данность координаты графических редакторов? Я большую часть жизни использую Paint.Net. Как оказалось, проект давно закрыл исходники, но у него есть open-source клон Pinta. Который, по моему мнению, начиная с версии 2.0 тоже пошёл куда-то не туда, уродуя интерфейс. Но в общем я форкнул себе старую версию Pinta и перевернул там отображаемые координаты. И жить сразу стало веселее.
DirectX я тоже перенастроил так, чтобы он как будто нативно был Bottom-Left. Для этого я переворачиваю текстуры при загрузке и ставлю отрицательную высоту у вьюпорта при рендере-в-текстуру. И получается, что он семплит и рендерит как будто по правилам OpenGL, не нужно ничего флипать в шейдерах. Всё растёт в одном направлении, всё консистентно.
Уж не знаю, делает ли так кто-нибудь ещё: обычно все переворачивают текстуры в OpenGL, чтобы они были как в DirectX, а я вот сделал наоборот всё. В RenderDoc, конечно, всё отображается вверх-ногами, но там, слава богу, есть кнопочка отзеркалить изображение.
А ещё у меня всё ещё Z-up. Надеюсь это менять не буду. Господи, когда же я уже буду игру делать, а не оси вертеть туда-сюда?
С днём, когда моё MS-бойство серьёзно пошатнулось.
Несмотря на то, что я сейчас пишу исключительно под винду и только на DirectX12, я в итоге перешёл во многом на OpenGL конвенции: Right-handed координаты и Bottom-left текстуры.
Да-да, это ещё один пост про чёртовы оси, и я их снова изменил.
Во всех бедах я по-прежнему продолжаю винить Сильвестра Лакруа и прочих составителей учебников по математике 18 века, повадившихся рисовать ось «Y» вверх. Именно они обрекли многие поколения школьников на страдания, всякий раз когда им требуется теперь отступить место для графика в школьной тетрадке.
А ведь у них была историческая возможность развернуть «Y» вниз, и тогда бы это удобно встраивалось в европейское письмо слева-направо и сверху-вниз (а положительные углы шли бы по часовой стрелке). А ведь направление письма сверху-вниз определило ещё и направление скроллинга страницы, и направление обновления монитора, а это, в свою очередь, повлияло и на систему координат большинства графических редакторов и файловых форматов.
Но увы. Они решили направить ось ординат наверх, и это во многом предопределило разброд и шатание по вертикале между DX и GL, между GUI и World Space.
Моя приверженность левосторонней системе координат и TopLeft-текстурам произрастала из приоритета консистентности над математичностью. Мне важно, чтобы мировые координаты росли туда же, куда и текстурные. И чтобы «X» вёл себя точно так же, как и «Y»: нет ничего более раздражающего, чем флип только одного компонента. А поскольку координаты графических редакторов (Paint, Photoshop) это своего рода данность, то я подсознательно выстраивал всё остальное под них.
И до поры до времени я был готов мириться с тем, что это нематематично: ну, подумаешь, повороты в игре будут идти в другую сторону. Задокументировать и забыть. Но я сдался на утилитах для 2D геометрии. Функции типа «площадь под кривой» или «IsClockwise» для многоугольника обычно предполагают, что мы смотрим на оси как принято в математике. Но если в моём движке большую часть времени мы смотрим на оси с обратной стороны (X — вправо, Y — вниз), то либо надо функции переименовывать, либо всегда держать в голове, что их значения перевёрнуты для геймплея. И всегда нужно помнить, где именно инвертировано внутри, а где — предполагается инвертировать на выходе. Это просто невозможный оверхед, который непременно приведёт к путанице, и к тому, что ты сам в какой-то момент перестанешь доверять названиям собственных функций.
Масла в огонь добавило то, что большинство DCC экспортят увишку по умолчанию как Bottom-Left и то же самое предполагает MikkTSpace — по сути стандарт тангент-спейса.
И тут я снова задумался: а такая уж ли данность координаты графических редакторов? Я большую часть жизни использую Paint.Net. Как оказалось, проект давно закрыл исходники, но у него есть open-source клон Pinta. Который, по моему мнению, начиная с версии 2.0 тоже пошёл куда-то не туда, уродуя интерфейс. Но в общем я форкнул себе старую версию Pinta и перевернул там отображаемые координаты. И жить сразу стало веселее.
DirectX я тоже перенастроил так, чтобы он как будто нативно был Bottom-Left. Для этого я переворачиваю текстуры при загрузке и ставлю отрицательную высоту у вьюпорта при рендере-в-текстуру. И получается, что он семплит и рендерит как будто по правилам OpenGL, не нужно ничего флипать в шейдерах. Всё растёт в одном направлении, всё консистентно.
Уж не знаю, делает ли так кто-нибудь ещё: обычно все переворачивают текстуры в OpenGL, чтобы они были как в DirectX, а я вот сделал наоборот всё. В RenderDoc, конечно, всё отображается вверх-ногами, но там, слава богу, есть кнопочка отзеркалить изображение.
А ещё у меня всё ещё Z-up. Надеюсь это менять не буду. Господи, когда же я уже буду игру делать, а не оси вертеть туда-сюда?
🤣21👍8