#1 Re: Вопросы и ответы » Платформы для Xtreme3D » 2022-04-24 09:31:02

Скорее всего, это невозможно, либо слишком трудоемко, и результат не будет стоить затраченных усилий.
О статусе движка я подробно написал тут.

#2 Re: Вопросы и ответы » Платформы для Xtreme3D » 2022-04-19 18:26:04

Только Windows. В теории его, думаю, можно на Linux портировать, но я вряд ли этим буду заниматься когда-либо.

#3 Re: Вопросы и ответы » пример Xtreme3D для GMS2 » 2022-04-09 15:39:02

Выпустил новую версию с функцией PtrToReal. Теперь создавать вид надо так:

viewer = ViewerCreate(0, 0, window_get_width(), window_get_height(), PtrToReal(window_handle()));

Ссылка на релиз

#4 Re: Вопросы и ответы » пример Xtreme3D для GMS2 » 2022-04-09 10:04:49

Да, вижу эту ошибку. В последних версиях GMS убрали совместимость указателей с real - сделаю в движке функцию для этого. Скорее всего, на днях будет обновление.

#5 Re: Вопросы и ответы » Уничтожение объектов » 2022-03-23 10:00:04

Fps падает в отсутствие оптимизации покадровой нагрузки. Чем больше видимых объектов, тем больше расчетов матриц в Update и нагрузка на пайплайн для обработки примитивов (которые, возможно, в итоге вообще не будут отрисованы). Так что, по идее, нужно скрывать объекты, которые находятся за пределами экрана. Куллинг по пирамиде видимости - EngineSetCulling(vcObjectBased) или EngineSetCulling(vcHierarchical) - может в этом помочь, но не во всех случаях - например, если объекты находятся за стеной или горой, то они все равно считаются видимыми для куллинга.
В интерьерных сценах можно сделать систему порталов (т.е., показываем комнату, только если игрок в ней, или на экране виден дверной проем - и так же, рекурсивно, связанные с ней комнаты). В общем случае это будет вычислительно дешевле, чем обычный куллинг, который является брутфорс-алгоритмом - при использовании порталов мы вообще не проходим по заведомо невидимым комнатам и не проверяем их. Xtreme в принципе имеет все нужные для системы порталов инструменты, но у меня пока нет готовой реализации.
В уличных сценах можно для детализированных объектов сделать lod'ы и использовать мультипрокси, но это конечно немного усложняет логику игры, в зависимости от используемых компонентов.

Из-за того, что мало встроенных оптимизаций, GLScene/Xtreme3D - скорее для маленьких игр с ограниченным миром, чем для open world и тому подобного. Вообще библиотека, как я понимаю, изначально создавалась больше под научную визуализацию, да и игры в те времена были не такие большие.

#6 Re: В процессе разработки » Xtreme3D Editor » 2022-03-22 07:17:48

Я в создании этого редактора никак не участвовал (у меня была попытка создать свой редактор, но это был просто эксперимент). Как тут обстоят дела, я конечно точно не знаю, это надо спрашивать у FireRun'а - насколько я помню, он свой движок пишет.

#7 Re: Вопросы и ответы » Теневые карты » 2022-03-21 10:23:50

Вот о чем я говорю (CSM):

csm1.png csm2.png

В красной зоне один размер проекции (в данном случае 3), в зеленой больше (15), в синей еще больше (100). При этом размер теневых карт не меняется, но за счет того, что на разных расстояниях от камеры используются разные проекции, получается максимальный охват площади с плавным уменьшением детализации, которое в финальном рендере не бросается в глаза, т.к. большая проекция очень далеко.

Если использовать только одну карту, то мы бы видели тени, грубо говоря, только в красной зоне. Если эта зона не в поле зрения камеры, то теней вообще не будет видно. Я подозреваю, у тебя именно такая ситуация.

image.png

#8 Анонсы » Статус Xtreme3D, сайта и сообщества » 2022-03-21 09:36:15

Gecko
Ответов: 0

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

Что из себя представляет Xtreme3D, и есть ли у него будущее?
Это движок на основе GLScene 1.0, написанный на Delphi 7. К сожалению, его невозможно портировать на современные версии Delphi без серьезной адаптации кодовой базы. В 2022 году писать на Delphi 7, сами понимаете, то еще "удовольствие", поэтому сама возможность добавлять новые фичи или как-то серьезно переделывать старые ограничена спецификой устаревшего языка, недоступностью современных библиотек и т.д. Другое существенное ограничение - OpenGL 1.5. Старый графический API не позволяет использовать многие техники, которые являются стандартом на сегодняшний день, или по крайней мере не дает реализовать их эффективно/кроссплатформенно/с удобством для пользователя. Переписывать Xtreme3D на другие языки и под современный OpenGL я не буду, так как это бесперспективная трата ресурсов - когда-то я начинал делать свой движок по образцу Xtreme3D, это постепенно привело меня к созданию Dagon, над которым я и работаю сейчас, и это уже совсем другая история.

Каков статус проекта и моего участия в нем в 2022 году (и в дальнейшем)?
Xtreme3D - это legacy-проект в режиме базовой техподдержки. Я больше не занимаюсь разработкой новых возможностей для Xtreme3D, и скорее всего 3.9 является последней версией. Максимум, я могу исправлять какие-то очевидные баги, которые легко детектить, либо добавлять простые функции-врапперы, не требующие написания новых классов и какой-либо сложной новой логики. Я в обозримом будущем буду поддерживать существование сайта https://xtreme3d.ru и, вероятно, буду появляться на форуме, чтобы по мере сил отвечать на вопросы.
Исходники Xtreme3D 3.x открыты - любой может брать и делать на их основе все, что угодно. Я могу лишь минимально консультировать по вопросам API и архитектуры движка, но я на сегодняшний день не имею никакого желания участвовать в неинтересных мне проектах в качестве бесплатного/дешевого разработчика на выходных или выполнять какие-либо заказы, связанные с Xtreme3D. У меня есть фулл-тайм работа, уходить с нее я буду только на такой же фулл-тайм за рыночную зарплату.
Также я не являюсь активным пользователем Game Maker - давно ушел на язык D. Проблемы совместимости Xtreme3D с Game Maker 8 (и Windows 10), как и вопросы удобства создания игр по современным стандартам на этой связке, сегодня уже не могут быть темой для серьезных дискуссий - учитывая огромный выбор альтернатив, бесплатных/недорогих движков и языков с хорошей поддержкой и кроссплатформенностью.

Если кого-то не устраивает такое положение дел, и он не готов большую часть времени самостоятельно разбираться в Xtreme3D и дорабатывать его, мириться с ограничениями, специфической архитектурой и проблемами совместимости, то я советую перейти на Unity, Unreal Engine или любой другой современный движок.

Надеюсь на понимание.

#9 Re: В процессе разработки » Xtreme3D Editor » 2022-03-21 08:58:50

Воду свою не забудьте добавить!!!

Я сомневаюсь, что тут будет дальнейший прогресс.

#10 Re: Вопросы и ответы » Теневые карты » 2022-03-21 08:14:03

Любые объекты должны отбрасывать тени) Скорее всего, неправильно что-то настроено. Или ты не там ищешь тень, где она должна быть (т.е., например, теневая камера неправильно повернута)
Также тень будет отсекаться по размеру проекции (ShadowMapSetProjectionSize). Теневая проекция имеет ограниченный размер в 3D. Все, что за ее пределами, не будет отбрасывать тень. Ее можно увеличить, но тогда пропорционально падает детализация теней - в этих случаях лучше использовать CSM, то есть, каскадные тени (но они не встроены в движок, нужно писать свой шейдер).

#12 Re: Вопросы и ответы » Уничтожение объектов » 2022-03-21 08:07:42

Просто в одном объекте не создашь количество нужных xtreme-объектов приближенной к бесконечности, в отличии от создания нового объекта-gm. Таких может быть бесчисленное множество. А делать все в объекте engine дает скончаемое количество (так как каждый xtreme-объект имеет свое имя).

Нет такого ограничения, для Xtreme совершенно не важно, как ты создаешь его объекты - он про ГМ ничего не знает. Это чисто вопрос архитектуры приложения.

К тому же я использую direction объекта для его поворота по Y и x y гамака, для передвижения. Остается только ObjectSetPosition(object,x,Y,y); Мне это нужно для движения и вычислений функций гамака, которые не стыкуются с объектами xtreme (например instance_nearest(x,y,object)) и их проще выставить в комнате (если они привязаны к x y). Есть какой-то другой способ о котором я не знаю?

Если так, то да, есть смысл делать в объектах ГМ. Но как я уже сказал, если что-то удалять динамически, есть риск того, что где-то остаются ссылки на несуществующие объекты.

Это может быть не баг если после события аларм происходит чтение из события степа объекта. Это может быть так? У меня в событии аларм уничтожается объект, а в степе еще есть функции с этим объектом.

Очень вероятно, что проблема где-то тут)

Кстати, забыл сказать: у видимых объектов Xtreme графические данные всегда создаются заново (у моделей, примитивов и пр.). Если нужно много точных копий объекта, то надо использовать Proxy (или ActorProxy), иначе память у тебя будет засоряться лишними копиями моделей.

#13 Re: Вопросы и ответы » Уничтожение объектов » 2022-03-19 18:04:45

Я бы делал все в одном объекте - если привязывать их к объектам ГМ, которые еще и динамически создаются, могут быть проблемы, связанные с очередностью выполнения логики в Step. В теории оно может так работать, но просто отлаживать сложнее.
Если что-то не удаляется нормально, то скорее всего не все связи очищены, что-то где-то продолжает ссылаться на объект.
Но я, если честно, не тестировал удаление всех типов объектов, так что допускаю, что это может быть баг.

#14 Re: Вопросы и ответы » Уничтожение объектов » 2022-03-19 17:38:39

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

#15 Re: Вопросы и ответы » Порядок прорисовки » 2022-03-19 17:18:23

Альфа-тест делается так: MaterialSetBlendingMode('myMaterial', bmAlphaTest50);
Или bmAlphaTest100, если надо вырезать альфу меньше 1 (bmAlphaTest50 - меньше 0.5)

Но, кстати, в стандартных шейдерах это не поддерживается - если нужен альфа-тест в шейдере, то надо его писать самостоятельно на GLSL. Т.е. код выше сработает только для материала без шейдера.

#16 Re: Вопросы и ответы » Порядок прорисовки » 2022-03-19 14:08:55

В Xtreme3D нет глубины объекта, порядок рендеринга определяется либо порядком создания объектов и их родителей (osInherited), либо встроенным в движок алгоритмом сортировки (osRenderFarthestFirst, osRenderNearestFirst, osRenderBlendedLast). В данном случае прозрачные объекты типа воды надо создавать после непрозрачных. Например, можно создать им глобального родителя, который идет после scene:

global.back = DummycubeCreate(0);
global.scene = DummycubeCreate(0);
global.transparent = DummycubeCreate(0);
global.front = DummycubeCreate(0);

Либо можно включить встроенную сортировку с учетом прозрачности: EngineSetObjectsSorting(osRenderBlendedLast), получится примерно то же самое, но видимо будет небольшая доп. нагрузка на проц (хотя я точно не измерял, насколько это существенно).

Другой, более хардкорный способ: рендерить функцией ViewerRenderEx вместо обычной ViewerRender, задавая явным образом порядок. В некоторых ситуациях очень удобно.

#17 Re: Вопросы и ответы » Теневые карты » 2022-03-19 13:59:46

Чтобы корректно растянуть на весь экран, нужно включить полноэкранный видеорежим, и чтобы размер вида совпадал с этим режимом. К сожалению, в ГМ ограниченный набор видеорежимов. Если просто сделать окно на весь экран (Start in fullscreen mode), и создать вид с размерами, полученными из display_get_width/height, то это может плохо работать (по крайней мере, у меня на некоторых конфигурациях некорректно работало).

Да и черт с ним, я считаю - я вообще не рекомендую ГМ8 использовать, слишком много там проблем накопилось. Мне вот интересно, как в Студии обстоят дела с этим, скорее всего лучше - как-нибудь на днях проверю.

#18 Re: Вопросы и ответы » Окно Xtreme 3d » 2022-03-19 13:35:57

Ты имеешь в виду, для проверки однократного нажатия, т.е. аналогично keyboard_check_pressed? Такой функции, к сожалению, нет (но могу подумать, как ее реализовать, как будет время)

#19 Re: Вопросы и ответы » Туман на весь экран » 2022-03-18 16:06:26

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

Бывает ли трехмерная векторная графика?
В отличии от пиксельной, как корел дро например и фотошоп?

Интересный вопрос) Мне кажется, в общем случае любая процедурная графика векторная, т.к. всегда идет процесс растеризации некоей векторной модели сцены, будь то меш или 2D-фигуры. В конечном счете, видеокарта растеризует треугольники, а они векторные. Текстуры и попиксельную шейдерную обработку в данном случае можно считать элементом растровой графики, но мне как-то ближе идея, что это просто функции. Даже если вся сцена описана пиксельным шейдером (например, если это raymarching), то это все равно не растр, а как бы векторное поле на экранной плоскости, где в каждой точке определена функция.

А если речь про псевдо-3D техники, такие как параллакс или имитация 3D-моделей 2D-фигурами, то конечно да, можно сделать 3D поверх двумерного векторного движка, я сам видел такие демки для canvas. Но у них возможности сильно ограничены, и это не так хорошо распараллеливается, как реальное 3D - растеризация и рейтрейсинг - которые потому и популярны, что их можно ускорять аппаратно.

#21 Re: Вопросы и ответы » Окно Xtreme 3d » 2022-03-18 15:45:33

Я могу сделать пример доп. окна, но предупреждаю, что в GM с ним неудобно работать) Я его добавил для языков, где нет встроенных функций для создания окон, чтобы, к примеру, не надо было подключать SDL для простых случаев.
В GM проблематичность в том, что в этой ситуации нужно обязательно отключить опцию Freeze the game when the form loses focus, иначе скрипт цикла будет приостановлен, когда фокус переключается на второе окно. Также нужно обрабатывать ввод встроенными функциями Xtreme3D (MouseGetPositionX, MouseGetPositionY, KeyIsPressed) и, соответственно, все гейммекеровские клавиатурные события не будут работать.

#22 Re: Вопросы и ответы » Материалы для Актёров » 2022-03-18 15:16:38

Если они уже грузятся с материалами, то да, назначение через ObjectSetMaterial может не работать (но для MD5 по моему опыту всегда срабатывало). Советую не экспортировать актеров с отдельными материалами на меш/фейсгруппу, такое в Xtreme может некорректно работать - поддержка таких моделей там, конечно, есть, но это такой древний код, который я опасаюсь трогать) Лучше делать одну текстуру/материал на всю модель.

#23 Re: Вопросы и ответы » Анимированные модели » 2022-03-10 13:40:24

MD2, MD3, MD5, SMD, MDC. Я рекомендую MD5, есть экспортер для блендера - правда, для старой версии, но вроде где-то видел и для новых.

#24 Re: Вопросы и ответы » Теневые карты » 2022-03-10 13:27:41

Посмотрел, никакого постороннего тумана не увидел (кроме черного, который и должен быть). Браузер никак не влияет.
Какая-то невнятная навигация по сцене, сложно нормально тестировать)

j-P15xbrk-WY.jpg

Пока вот что заметил:

view1 = ViewerCreate(0, 0, display_get_width(), display_get_height(), window_handle());

при том, что окно 500x500, к тому же идет запуск в полноэкранном режиме. В Xtreme3D это может плохо работать. Советую размер комнаты/окна и размер view делать одинаковый, например 1280x720, и потестить сначала в оконном режиме. Start in fullscreen mode в ГМ сам по себе некорректно работает при использовании сторонней графики. Если наужен фулскрин, то надо еще в настройках Resolution поставить галку Set the resolution of the screen и выставить нужные настройки. Соответственно, соотношение размера окна и view должны быть такими же, как у выбранного видеорежима (то есть, 3:4, так как ГМ8 не поддерживает другие соотношения). Это самый надежный способ, насколько я знаю.

А кому нужно создавать эти шейдеры? Тому кто отбрасывает тень или тот на кого она падает?

Материал 'mShader' применить к объектам, на которые должна падать тень. У объектов, которые отбрасывают тень, шейдер не имеет значения, но они могут использовать тот же самый (т.е., и отбрасывать, и принимать). Главное их добавить в дерево к shadowCasters.

#25 Re: Вопросы и ответы » Теневые карты » 2022-03-09 15:09:30

Как вообще реалистичный ландшафт в играх делается? Не загружают же огромную текстуру, это ж сколько К нужно. Скорее всего маленькая разноцветная, и цвета заменяют на готовые текстуры и просто устанавливают тайловость и детализацию. Ну и карта высот тоже наверное есть. Из неё то и получают геометрию.

Шейдер с неск. слоями повторяющихся текстур, а как их смешивать - есть много способов. Triplanar mapping для простых случаев, либо да, из разноцветного splatmap'а считывать индекс текстуры/интерполянт в данной точке. Я в своем движке интерполирую между 4 текстурами в зависимости от 4 каналов splatmap. Видел и более сложные варианты с большим набором тайлов по принципу мегатекстуры, но подробно не изучал.

Кстати возвращаясь к теме вопроса. Я не понимаю что нужно делать с bumpshader, его просто создать нужно функцией и как-то назвать? Зачем тогда это делать.

Я думал, у тебя он уже создается)

Делается примерно так:

MaterialCreate('mDiffuse', 'diffuse.png');
MaterialCreate('mNormal', 'normal.png');
bumpShader = BumpShaderCreate();
BumpShaderSetDiffuseTexture(bumpShader, 'mDiffuse');
BumpShaderSetNormalTexture(bumpShader, 'mNormal');
BumpShaderSetMaxLights(bumpShader, 8);

MaterialCreate('mShader', '');
MaterialSetShininess('mShader', 32);
MaterialSetAmbientColor('mShader', c_dkgray, 1);
MaterialSetDiffuseColor('mShader', c_white, 1);
MaterialSetSpecularColor('mShader', c_white, 1);
MaterialSetShader('mShader', bumpShader);

Подвал доски

Под управлением FluxBB