![]() |
Ответ: [TrueHorror] - разработка
Буду время от времени изучать.
Ранее здесь шли разговоры о borderless window и 30fps в Ubisoft играх. И вроде бы нашлось решение менять разрешение в borderless окне, а вот что насчёт fps? Оконное приложение в d3d9 можно создавать с параметрами FullScreen_RefrashRateInHz = 0 и PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT | D3DPRESENT_INTERVAL_ONE | D3DPRESENT_INTERVAL_IMMEDIATE. Во первых сделать 30 fps не получится, во вторых нет уверенности что у пользователя установлено 60. Как вариант можно установить IMMEDIATE, а затем поставить ручной ограничитель. Кто что думает? |
Ответ: [TrueHorror] - разработка
Попробуй в Renderer::RenderWorld вместо
Код:
float timeStep = 1.0f / 60.0f; Код:
float timeStep = 1.0f / 60.0f; |
Ответ: [TrueHorror] - разработка
Так только тормозит сильнее физика и не помогло.
|
Ответ: [TrueHorror] - разработка
Удобно что в оконном режиме (в том числе borderless), даже если открываешь стартовое меню, которое в Win8 полноэкранное, не происходит потеря устройства.
|
Ответ: [TrueHorror] - разработка
У тебя оказывается ещё OpenGL движок есть.
Кстати я тоже не сторонник выкладывать в репозиторий файлы проекта и прочие вещи относящиеся больше к IDE чем к коду, но всё-таки совсем без инструкции непонятно что с чем собирать. Например у себя я по папкам разбросал исходники -- каждая папка это модуль сборки, ещё есть батник (или makefile) в котором так-же можно разобраться в структуре проекта, и выставив пути, собрать. |
Ответ: [TrueHorror] - разработка
Таки движок на огле так себе поделка.
Чтобы собрать нужно иметь еще кучу всего. DirectX SDK Bullet 2.83 MagicInput ( h, lib ) - мышь\клава ProjectF ( h, lib ) - звук Еще есть конвертер, скрипт для макса, Visual Leak Detector. Все кроме булета и vld и DirectX SDK могу скинуть отдельно. + файлы проекта( на VS 2012 ) Кароч проект большой и имеет кучу зависимостей, так что с системы на систему трудно переезжать. Движок ( Ruthenium.dll ) - это все кроме того что лежит в Game Игра - ( Mine.exe ) - это Game |
Ответ: [TrueHorror] - разработка
Давай скинь, попробую собрать.
MagicInput и ProjectF если будут меняться, то их тоже имеет смысл зарепозиторить. Кстати буллет не тот движок чтобы обновлять, обычно выбирают одну версию на весь цикл разработки проекта. Обычно раз есть исходники, можно самому допиливать и добавлять нужные возможности. |
Ответ: [TrueHorror] - разработка
Медия уже сильно поменялась, изменились многие конфиги... кароч чтоб тебе собрать и запустить нормально нужно тебе кидать всю рабочую папку - это почти 1,5 Гб.
Кароч, если у тебя есть скайп можешь мне написать, я скину свежую версию. мой скайп xcoolmrdimas |
Ответ: [TrueHorror] - разработка
Че сделал:
1) Сохранение\загрузку уровня. Соответственно быстрое сохранение\загрузка тоже есть. Игра сохраняется при выходе. Чек поинты делать не буду - слишком казуально. 2) Всё :-D Сделать сохранение\загрузку оказалось не такой простой задачей. В общем потратил кучу времени, но все равно остались некоторые мелкие баги не влияющие на загрузку\сохранение. Потестировать можно будет когда я сделаю еще один уровень и доделаю предыдущие уровни. Впрочем кто шарит C++ может глянуть репозиторий на GitHub'e у меня в подписи. |
Ответ: [TrueHorror] - разработка
по концепции расскажи вкратце как делал сейв/лоад?
в шарпе мне дико помог встроенный в язык Reflection, но я каждый раз содрогаюсь при мысли о том, как бы я это реализовывал на С++. |
Ответ: [TrueHorror] - разработка
Делал "в лоб".
При сохранении: 1) Сохраняем данные чилдов корня уровня. Пишем имя чилда( у всех объектов в двиге всегда уникальные имена ), пишем позицию, поворот, виден\скрыт. 2) Сохраняем позицию игрока, и все его параметры - это около 50 переменных. 3) Сохраняем предметы. Пишем имя объекта к которому привязан предмет( нода предмета загружается вместе с уровнем ). Пишем параметры предмета. Ну и в таком духе все остальное делаем. При загрузке: 1) Читаем имя чилда. Находим его в сцене( глобально ). Читаем все его параметры. 2) Читаем позицию игрока, читаем его параметры. 3) Читаем имя предмета. Находим указатель на предмет по имени предмета( да, вот такой оверхед, но зато просто ). Читаем параметры предмета, и суем их по указателю в сам предмет. Теперь объясню почему именно так. Если при загрузке сейва уровень_N не создан, то создается дефолтный уровень_N - при загрузке создаются все предметы, двери, и прочее прочее, затем уже происходит загрузка самого сейва и возвращение всех параметров объектов. То есть всегда гарантируется наличие всех объектов на дефолтном уровне_N. Быстрое сохранение\загрузка работают очень быстро - 10 мс. Кароч моментально загружается\сохраняется. Возможно для игры другого типа этот подход не прокатит. Особенно если объекты создаются динамически. У меня так просто получилось именно из-за наличия фиксированного числа объектов на каждом уровне. Можно глянуть сурсы на гитхабе - сначала можно посмотреть SaveWriter\SaveLoader затем у каждого сохраняемого объекта есть метод Serialize\Deserialize |
Ответ: [TrueHorror] - разработка
я у себя в игре задолбался с динамически создаваемыми объектами, большинство глюков выходило именно из-за них. в результате по максимуму зарезервировал в сцене важные сложные объекты типа всех приезжающих копов, их машин, чтобы они всегда чётко были одни и те же.
у меня трабла значительная была ещё с тем, что переменных просто миллион, каждый нпс в себе содержит добрую сотню их, а завтра я могу добавить ещё какой-нибудь float timeToStopShoutingAtDogsWhoShitUnderTrees, и мне ещё это добавлять в сейв/лоад?! а у каждого нпс с уникальным поведением/диалогами - ещё свои переменные. так что необходимо было мутить универсальную систему, которой не нужно знать ничего более имени класса, руками перебирать я бы просто обосрался. и вот в С++ думаю разве что кодогенератором сделал на основе существующих хидеров с переменными. |
Ответ: [TrueHorror] - разработка
Можно сделать как в кваке сделано. Там есть тип cvar_t, им можно рулить из консоли( если играл, поймешь о чем я ). И есть общий список всех таких переменных
Пример его использования PHP код:
|
Ответ: [TrueHorror] - разработка
так речь о том что руками каждую переменную обрабатывать - не комильфо)
|
Ответ: [TrueHorror] - разработка
Ну а щито поделать, если нанять штат индусов за три копейки им это будет не влом. Вообще тянуть одному проект больше казуалки, довольно сложно.
|
Ответ: [TrueHorror] - разработка
ну вот я и говорю, что не "щито поделать", а я сделал это. но в шарпе.
а в цпп разве что кодогеном. |
Ответ: [TrueHorror] - разработка
Мне кажется если есть редактор сцены, который редактирует/сохраняет/загружает, то его и можно использовать для сохранения/загрузки в игре.
Зачем придумывать ещё один механизм. Если в юнити нельзя его редактор приспособить -- то это как раз проблемы юнити и его пользователей =), а на цпп в своем движке можно сделать как тебе надо. |
Ответ: [TrueHorror] - разработка
Цитата:
Такой способ сохранения сам по себе не "казуальный". Примеры Пенумбра, Амнезия, Дарк Соулс, сохранения только у специальных объектов, артефакт, сесть у костра (правда может я ошибаюсь и это чекпоинтами нельзя назвать из-за не автоматического сохранения?). Под "не автоматическим" я имею ввиду что для сохранения прогресса игры нужно совершить действие, а не просто добраться до нужного места, как в CoD и Far Cry 3, впрочем и последний способ по своему хорош. P. S. Блин Samodelkin уже тут... |
Ответ: [TrueHorror] - разработка
Моя идея в том чтобы перенести систему сохранение/загрузка из категории интерфейса приложения в категорию игровой механики, чтобы это было частью игры.
Такой подход не должен усложнять жизнь игроку, но нажатие F5 настолько облегчает игровой процесс, что почти любое другое решение так или иначе его усложнит, однако я считаю что система должна быть не сложнее других частей игры. Также важно понять что это касается смерти/проигрыша, то есть ограничение распространяется на игровой процесс, если пользователь хочет выйти из приложения то нужно сохранять без вопросов в любом месте, или скрыто сохранять на тот случай чтобы при вылете/отключении питания игра загрузилась как можно ближе. То есть чётко разделять свободу действий пользователя работы с приложением и правила игры. Игровой процесс в свою очередь должен соответствовать такой системе, то есть смерть/проигрыш не должен быть тупиком -- игра должна продолжаться, как либо восстанавливая исходную ситуацию, или же идти другим путем. |
Ответ: [TrueHorror] - разработка
Посоветуйте аналог ID3DXFont. Текст он рисует отлично, но очень тормозно. Вариант - вытащить глифы из ID3DXFont и рисовать квады меня не сильно радует. Может есть какая-то универсальная библа?
|
Ответ: [TrueHorror] - разработка
Я где-то 20 страниц назад говорил что ID3DXFont тормозной будет.
Я текст вывожу текстурой. Как вариант, если текст не меняется, можно один раз нарисовать через ID3DXFont и дальше выводить как текстуру. |
Ответ: [TrueHorror] - разработка
Цитата:
Можно генерить из них буфер уже готовый с текстом (если тот не меняется) и рендерить его. Рикаминдую. |
Ответ: [TrueHorror] - разработка
Ну тогда буду городить свой велосипед с квадами, я уже писал подобное так что проблем быть не должно.
|
Ответ: [TrueHorror] - разработка
Вложений: 1
Сделал пятно для фонаря в виде текстуры. Все вроде норм но только ингогда текстура как-будто тайлится. Проецирую и беру тексел так:
Код:
" float4 projPos = mul(float4(p.xyz,1), spotProjMatrix);\n" Че за приколы? как убрать тайлинг? |
Ответ: [TrueHorror] - разработка
непонятно. clamp должен делать норм - может быть он где-то слетает.
Цитата:
я тут как раз писал на днях на эту тему: http://ndotl.wordpress.com/2014/10/1...shader-system/ |
Ответ: [TrueHorror] - разработка
Да, clamp вообще не ставился из шейдера, я так понял если я собираю не эффект, то настройки семплера внутри кода шейдера игнорируются? Поставил вручную через SetSamplerState и все норм стало.
Про код шейдера - он у меня цельным куском - позже вытащу в файл. |
Ответ: [TrueHorror] - разработка
Хм. Проекция текстуры пятна от источника не масштабируется. В реале когда фонарь подносишь близко к объекту то пятно пропорционально уменьшается, и наоборот. Матрицу проекции строю через D3DXMatrixLookAtRH.
Код:
void Light::BuildSpotProjectionMatrix() { |
Ответ: [TrueHorror] - разработка
LookAt не содержит проекцию же. Тебе надо строить в точности как для камеры с перспективной проекцией - тогда будет проецироваться, как фрустумом, вблизи маленько, вдали расширено.
|
Ответ: [TrueHorror] - разработка
Вот я тупанул. Етить. 2 часа втыкал в чем дело. ммм да
|
Ответ: [TrueHorror] - разработка
Вложений: 2
Вот результат:
Текстура спота: И кстати поставил AddressU, V = Border чтоб избежать багов когда по краям текстуры есть яркие пиксели |
Ответ: [TrueHorror] - разработка
збс, хотя ощущение что границы очень чёткие, для такого расстояния от источника.
ещё подобие отражённого света не помешало бы в идеале, можешь тупо поинт лайт (а лучше полупоинт, или типа как 180 градусный спот) ставить в центр спроецированного пятна света и красить его в цвет альбедо который под ним на экране. |
Ответ: [TrueHorror] - разработка
Текстурку я бы сменил на какую-нибудь более асимметричную и с большим количеством деталей (фонарь то старый, на стекле грязь).
Даже в 2150 году фонари не идеальны: http://www.ag.ru/games/doom-3/screenshots/99703 (надо в движении смотреть -- тогда будет лучше видно много разных градаций яркости по всему световому пятну). |
Ответ: [TrueHorror] - разработка
Цитата:
А в чём проблема сериализовать объект путём тупо дампа занимаемой им памяти? Проблемы будут только со значением указателей, все же другие типы переменных должны после обратного действа адекватно восстановиться. Альтернативное решение - намутить свой менеджер параметров. Как-то надо было реализовать класс, в котором (по мере проработки ТЗ) постоянно удаляли/добавляли кучу логически слабо связанных параметров, поэтому "тупо массив" использовать было неудобно. Что-то типа: объявляется пространство имён МоиПараметры, а внутри - безымянный enum Код:
enum {AI_FLAG, Менеджер, оперирует параметром, зная его код, скрытый от программиста интуитивным именем константы. Включать/исключать пространство имён в классы следует в зависимости от архитектуры и взаимосвязей объектов. Зато массовые операции (запись, загрузка, упаковка, распаковка - которые тоже необходимо было реализовать в моём случае) кодятся просто. Добавляется дополнительная защита от забывчивости с размерами памяти под параметры, и от опечаток в именах, и от сокрытия области видимости, исчезает проблема с "дырками" в массиве в ходе рефакторинга, уходим от конкретных значений индексов и проч. Внутри менеджера, можно использовать быстрый контейнер (если уместно - даже просто массив), а скорость интерфейса ограничится лишь степенью обеспечиваемой безопасности (меньше проверок - быстрее работает) и "гомогенностью" типов параметров. |
Ответ: [TrueHorror] - разработка
Как сделать ореол ( light flare ) вокруг источника света? Ну я про то если отходишь от лампы то появляется такой ореол. Единственная мысль: нарисовать квад повернутый на камеру и без записи с буфер глубины. Но как делают тру пацаны?
|
Ответ: [TrueHorror] - разработка
Цитата:
и юзаешь бленд типа аддитивного или screen. |
Ответ: [TrueHorror] - разработка
А можно ли как-нибудь спроецировать текстуру для поинт лайта, ну допустим лампа грязная и свет от нее тусклый - таким образом будут видны тени от грязи на стекле. тут что-то с кубемапами нужно городить?
|
Ответ: [TrueHorror] - разработка
ага, можно кубмапой. просто юзаешь вектор света как выборку для неё.
|
Ответ: [TrueHorror] - разработка
Сделал. Записал видео - ибо на скрине будет не понятно.
Кубемапу делал с помощью тулзы от AMD. (первое что гугл выдал ) Грани кубемапы одинаковые, пока что. |
Ответ: [TrueHorror] - разработка
тебе надо кубмапу сделать, отрендерив из центра лампы чёрным по белому, чтобы она именно тень себя бросала.
|
Ответ: [TrueHorror] - разработка
я делаю общий случай с заранее подготовленными текстурами. потом добавлю тени, и отпадет необходимость делать кубмапу рендером. мне нужно получить именно эффект грязного замызганного стекла, не более.
|
Ответ: [TrueHorror] - разработка
ну вообще у лампы твоей низ и верх закрыт нафиг - так что она должна светить заметно темнее с этих сторон.
|
Ответ: [TrueHorror] - разработка
Я для каждого типа ламп запилю свою кубмапу. Сделал такую текстуру просто для теста.
|
Ответ: [TrueHorror] - разработка
Цитата:
Ещё в составе DX SDK есть тулза создающая DDS в том числе кубические и объёмные. |
Ответ: [TrueHorror] - разработка
А как сделать, чтобы лучи света видно было? Ну типа в конусе спота чтобы как-бы была подсвеченная пыль, или в сфере поинта то же? Или это уже только системой частиц?
|
Ответ: [TrueHorror] - разработка
Спрайты?
Спрайты с анимацией пыли и маской. |
Ответ: [TrueHorror] - разработка
Та нет, мне нужно объемное распределение подсвеченой пылищи. Все таки походу системой частиц ваять придется.
|
Ответ: [TrueHorror] - разработка
Спрайты с анимацией пыли и картой освещения? Которые обрезаются по маске из освещения.
Разве идея плоха? Мне кажется частицы здесь совсем необязательны. Видишь звёзды внизу между планет, они сделаны спрайтами: В движение хорошо смотрится. |
Ответ: [TrueHorror] - разработка
конусы спотов в сорс играх делали 1 билбордом с видом сбоку (крутящимся только вокруг одной оси) и одним с видом спереди, в L4D сделали покруче: многослойный фрустум из квада аля спереди + полностью боковой. но это +овердро.
ещё можно отрендерить в отдельную текстуру глубину конуса и в ещё одну - глубину флипанутого конуса, а потом в постэффекте на основе расстояния между этими двумя глубинами сделать эффект аля объёмный туман + мягко пересечь его с геометрией сцены, юзая её глубину. вообще вариантов куча. |
Ответ: [TrueHorror] - разработка
Цитата:
Цитата:
|
Ответ: [TrueHorror] - разработка
с частицами тоже вариант, но может тормозно выйти из-за овердро, если я правильно понял идею (понаставить кучу частиц и на каждой вычислять свет спота?)
|
Ответ: [TrueHorror] - разработка
будет ли прирост производительности если все шейдерные константы замапить напрямую в регистры и потом устанавливать их через вызовы setvertexshaderconstant/setpixelshaderconstant? и как быть например с таким:
Код:
float4x4 worldViewProjection; Код:
float4x4 worldViewProjection : register( c0 ); кароч расскажите че да как. |
Ответ: [TrueHorror] - разработка
и еще вопрос вдогонку: как мне отрисовывать фонарик перед камерой, так чтобы он не загораживался другими объектами - кароч поверх всех? вроде бы ответ прост: нарисуй все объекты, затри буфер глубины, и нарисуй фонарик. но нифига! буфер глубины у меня используется в дефереде для оптимизаций буфером трафарета. поэтому это не вариант. форвард рендер у меня в зачаточном состоянии - рисует только полупрозрачные объекты и без освещения. я уже перепробовал рисовать фонарик после всех с отключенной записью в буфер глубины, с отключенным буфером вообще. получается шлак - полигоны перемешиваются в кашу - один на другой накладываются. че делать?
в коде дума3 нашел интересный код Код:
/* update. перевел его на dx. и он работает, это классно. вот мой вариант: Код:
void Camera::EnterDepthHack( float depth ) |
Ответ: [TrueHorror] - разработка
взялся за тени. пока что делаю только для спота - ибо проще. что делаю:
1) создал текстуру шадоумапы - R32F 2) отрисовал туда глубину сцены из положения и направления спота с fov равным углу при вершине конуса спота. как дальше быть при выборке из шадоумапы при учете освещения? как спроецировать текстурные координаты? |
Ответ: [TrueHorror] - разработка
проецируешь так же, как с картинкой фонарика.
дальше сравниваешь глубину (Z полученный при проекции): ближе текстуры? на свету. дальше? в тени. нужно ещё маленький оффсет прибавлять туда-сюда перед сравнением, а то точность не идеальна. |
Ответ: [TrueHorror] - разработка
чет фигня получается если проецировать как для картинки фонарика, тень вращается вместе с камерой. че делать?
|
Ответ: [TrueHorror] - разработка
не понял как вращается.
короче рендеришь тени с камеры, привязанной к персу (то бишь локальная ворлд матрица камеры должна домножаться на ворлд матрицу перса), и проецируешь матрицей той же самой камеры. |
Ответ: [TrueHorror] - разработка
wat? а где тогда используется матрица спота?
|
Ответ: [TrueHorror] - разработка
ну и пятно спота той же камерой проецируешь, что и тени, нафига тебе 2 разные матрицы, если это всё проецируется с одного лайта?
|
Ответ: [TrueHorror] - разработка
Я немного упорот сегодня поэтому, все еще разок с начала. Мои действия: 1) Создаю viewProjection матрицу для спота. 2) С ее помощью отрисовываю сцену - получаю шадоумапу. 3) При расчете освещения беру восстановленую позицию( по глубине ), и домножаю ее на матрицу viewProjection спота, делаю выборку из текстуры ... С текстурой пятна все хорошо, с тенями нет - они вращаются при повороте камеры. Можно объяснение для даунов пжлста. |
Ответ: [TrueHorror] - разработка
запиши видео чтоли, не представляю как оно вращается
|
Ответ: [TrueHorror] - разработка
здесь только буфер глубины показан, без расчета теней
[УДАЛЕНО] еще глянь код чтоли, в подписи у меня есть ссылка на репозиторий, файлы ShadowMap.h и DeferredRenderer.cpp |
Ответ: [TrueHorror] - разработка
можешь просто объяснить последовательность действий? только поподробней
|
Ответ: [TrueHorror] - разработка
да вроде всё правильно делаешь, в коде долго разбираться.
выведи в маленький вьюпорт сбоку содержимое шадоумапы подскейленное, чтобы его хорошо видно было и посмотри, что там с проекцией творится, видит ли фонарик то, что должен видеть. |
Ответ: [TrueHorror] - разработка
Вложений: 1
я опять вляпался по-колено в z-буфер. чистить и записывать в него мне его нельзя, следовательно нормально шадоумапу я нарисовать не смогу, если я чищу з-буфер у меня слетают оптимизации трафаретом, но получается хорошая шадоумапа. на скрине результат отрисовки с
Код:
g_device->SetRenderState( D3DRS_ZENABLE, FALSE ); Код:
g_device->SetRenderState( D3DRS_ZENABLE, TRUE ); |
Часовой пояс GMT +4, время: 18:11. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot