forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   [TrueHorror] - разработка (http://forum.boolean.name/showthread.php?t=17293)

Samodelkin 11.10.2014 23:59

Ответ: [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, а затем поставить ручной ограничитель.
Кто что думает?

Samodelkin 12.10.2014 15:35

Ответ: [TrueHorror] - разработка
 
Попробуй в Renderer::RenderWorld вместо
Код:

float timeStep = 1.0f / 60.0f;

//if( g_fpsCounter.fps > 0 )
//  timeStep = 1.0f / (float)g_fpsCounter.fps;

const int subSteps = 4;

g_dynamicsWorld->stepSimulation ( timeStep, subSteps );

написать
Код:

float timeStep = 1.0f / 60.0f;

//if( g_fpsCounter.fps > 0 )
//  timeStep = 1.0f / (float)g_fpsCounter.fps;

const int subSteps = 4;

g_dynamicsWorld->stepSimulation ( timeStep, subSteps, 1.0f / 120.0f );

Если это не исправит проблему, значит она в другом.

mr.DIMAS 12.10.2014 16:18

Ответ: [TrueHorror] - разработка
 
Так только тормозит сильнее физика и не помогло.

Samodelkin 12.10.2014 19:52

Ответ: [TrueHorror] - разработка
 
Удобно что в оконном режиме (в том числе borderless), даже если открываешь стартовое меню, которое в Win8 полноэкранное, не происходит потеря устройства.

Samodelkin 13.10.2014 16:05

Ответ: [TrueHorror] - разработка
 
У тебя оказывается ещё OpenGL движок есть.

Кстати я тоже не сторонник выкладывать в репозиторий файлы проекта и прочие вещи относящиеся больше к IDE чем к коду, но всё-таки совсем без инструкции непонятно что с чем собирать.

Например у себя я по папкам разбросал исходники -- каждая папка это модуль сборки, ещё есть батник (или makefile) в котором так-же можно разобраться в структуре проекта, и выставив пути, собрать.

mr.DIMAS 13.10.2014 17:23

Ответ: [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

Samodelkin 13.10.2014 19:56

Ответ: [TrueHorror] - разработка
 
Давай скинь, попробую собрать.
MagicInput и ProjectF если будут меняться, то их тоже имеет смысл зарепозиторить.
Кстати буллет не тот движок чтобы обновлять, обычно выбирают одну версию на весь цикл разработки проекта.
Обычно раз есть исходники, можно самому допиливать и добавлять нужные возможности.

mr.DIMAS 14.10.2014 01:55

Ответ: [TrueHorror] - разработка
 
Медия уже сильно поменялась, изменились многие конфиги... кароч чтоб тебе собрать и запустить нормально нужно тебе кидать всю рабочую папку - это почти 1,5 Гб.

Кароч, если у тебя есть скайп можешь мне написать, я скину свежую версию. мой скайп xcoolmrdimas

mr.DIMAS 15.10.2014 00:31

Ответ: [TrueHorror] - разработка
 
Че сделал:

1) Сохранение\загрузку уровня. Соответственно быстрое сохранение\загрузка тоже есть. Игра сохраняется при выходе. Чек поинты делать не буду - слишком казуально.
2) Всё :-D

Сделать сохранение\загрузку оказалось не такой простой задачей. В общем потратил кучу времени, но все равно остались некоторые мелкие баги не влияющие на загрузку\сохранение.

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

Впрочем кто шарит C++ может глянуть репозиторий на GitHub'e у меня в подписи.

Mr_F_ 15.10.2014 00:42

Ответ: [TrueHorror] - разработка
 
по концепции расскажи вкратце как делал сейв/лоад?
в шарпе мне дико помог встроенный в язык Reflection, но я каждый раз содрогаюсь при мысли о том, как бы я это реализовывал на С++.

mr.DIMAS 15.10.2014 01:03

Ответ: [TrueHorror] - разработка
 
Делал "в лоб".

При сохранении:
1) Сохраняем данные чилдов корня уровня. Пишем имя чилда( у всех объектов в двиге всегда уникальные имена ), пишем позицию, поворот, виден\скрыт.
2) Сохраняем позицию игрока, и все его параметры - это около 50 переменных.
3) Сохраняем предметы. Пишем имя объекта к которому привязан предмет( нода предмета загружается вместе с уровнем ). Пишем параметры предмета.

Ну и в таком духе все остальное делаем.

При загрузке:
1) Читаем имя чилда. Находим его в сцене( глобально ). Читаем все его параметры.
2) Читаем позицию игрока, читаем его параметры.
3) Читаем имя предмета. Находим указатель на предмет по имени предмета( да, вот такой оверхед, но зато просто ). Читаем параметры предмета, и суем их по указателю в сам предмет.

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

Быстрое сохранение\загрузка работают очень быстро - 10 мс. Кароч моментально загружается\сохраняется.

Возможно для игры другого типа этот подход не прокатит. Особенно если объекты создаются динамически. У меня так просто получилось именно из-за наличия фиксированного числа объектов на каждом уровне.

Можно глянуть сурсы на гитхабе - сначала можно посмотреть SaveWriter\SaveLoader затем у каждого сохраняемого объекта есть метод Serialize\Deserialize

Mr_F_ 15.10.2014 01:08

Ответ: [TrueHorror] - разработка
 
я у себя в игре задолбался с динамически создаваемыми объектами, большинство глюков выходило именно из-за них. в результате по максимуму зарезервировал в сцене важные сложные объекты типа всех приезжающих копов, их машин, чтобы они всегда чётко были одни и те же.

у меня трабла значительная была ещё с тем, что переменных просто миллион, каждый нпс в себе содержит добрую сотню их, а завтра я могу добавить ещё какой-нибудь float timeToStopShoutingAtDogsWhoShitUnderTrees, и мне ещё это добавлять в сейв/лоад?! а у каждого нпс с уникальным поведением/диалогами - ещё свои переменные. так что необходимо было мутить универсальную систему, которой не нужно знать ничего более имени класса, руками перебирать я бы просто обосрался.
и вот в С++ думаю разве что кодогенератором сделал на основе существующих хидеров с переменными.

mr.DIMAS 15.10.2014 01:12

Ответ: [TrueHorror] - разработка
 
Можно сделать как в кваке сделано. Там есть тип cvar_t, им можно рулить из консоли( если играл, поймешь о чем я ). И есть общий список всех таких переменных
Пример его использования
PHP код:

cvar_t    sv_gravity = {"sv_gravity","800",false,true}; 

Может я говорю очевидные вещи, но можно взять шарповский аналог сишного map. Возможно это будет слишком жирно, но удобство пользования подкупает.

Mr_F_ 15.10.2014 01:24

Ответ: [TrueHorror] - разработка
 
так речь о том что руками каждую переменную обрабатывать - не комильфо)

mr.DIMAS 15.10.2014 01:29

Ответ: [TrueHorror] - разработка
 
Ну а щито поделать, если нанять штат индусов за три копейки им это будет не влом. Вообще тянуть одному проект больше казуалки, довольно сложно.

Mr_F_ 15.10.2014 01:46

Ответ: [TrueHorror] - разработка
 
ну вот я и говорю, что не "щито поделать", а я сделал это. но в шарпе.
а в цпп разве что кодогеном.

Samodelkin 15.10.2014 02:03

Ответ: [TrueHorror] - разработка
 
Мне кажется если есть редактор сцены, который редактирует/сохраняет/загружает, то его и можно использовать для сохранения/загрузки в игре.

Зачем придумывать ещё один механизм.

Если в юнити нельзя его редактор приспособить -- то это как раз проблемы юнити и его пользователей =), а на цпп в своем движке можно сделать как тебе надо.

Arton 15.10.2014 02:04

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 288115)
Чек поинты делать не буду - слишком казуально.

Так и представляю как приходит Samodelkin и доказывает обратное.

Такой способ сохранения сам по себе не "казуальный".

Примеры Пенумбра, Амнезия, Дарк Соулс, сохранения только у специальных объектов, артефакт, сесть у костра (правда может я ошибаюсь и это чекпоинтами нельзя назвать из-за не автоматического сохранения?).

Под "не автоматическим" я имею ввиду что для сохранения прогресса игры нужно совершить действие, а не просто добраться до нужного места, как в CoD и Far Cry 3, впрочем и последний способ по своему хорош.

P. S. Блин Samodelkin уже тут...

Samodelkin 15.10.2014 02:37

Ответ: [TrueHorror] - разработка
 
Моя идея в том чтобы перенести систему сохранение/загрузка из категории интерфейса приложения в категорию игровой механики, чтобы это было частью игры.

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

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

Игровой процесс в свою очередь должен соответствовать такой системе, то есть смерть/проигрыш не должен быть тупиком -- игра должна продолжаться, как либо восстанавливая исходную ситуацию, или же идти другим путем.

mr.DIMAS 15.10.2014 22:53

Ответ: [TrueHorror] - разработка
 
Посоветуйте аналог ID3DXFont. Текст он рисует отлично, но очень тормозно. Вариант - вытащить глифы из ID3DXFont и рисовать квады меня не сильно радует. Может есть какая-то универсальная библа?

Samodelkin 15.10.2014 23:45

Ответ: [TrueHorror] - разработка
 
Я где-то 20 страниц назад говорил что ID3DXFont тормозной будет.

Я текст вывожу текстурой.

Как вариант, если текст не меняется, можно один раз нарисовать через ID3DXFont и дальше выводить как текстуру.

ABTOMAT 16.10.2014 02:16

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 288153)
ариант - вытащить глифы из ID3DXFont и рисовать квады меня не сильно радует.

Я за 1 день написал текст на квадах, это несложно.
Можно генерить из них буфер уже готовый с текстом (если тот не меняется) и рендерить его. Рикаминдую.

mr.DIMAS 16.10.2014 11:38

Ответ: [TrueHorror] - разработка
 
Ну тогда буду городить свой велосипед с квадами, я уже писал подобное так что проблем быть не должно.

mr.DIMAS 19.10.2014 15:11

Ответ: [TrueHorror] - разработка
 
Вложений: 1
Сделал пятно для фонаря в виде текстуры. Все вроде норм но только ингогда текстура как-будто тайлится. Проецирую и беру тексел так:
Код:

"  float4 projPos = mul(float4(p.xyz,1), spotProjMatrix);\n"
        "  projPos.xyz /= projPos.w;\n"
        "  float2 projTexCoords = projPos.xy*0.5+0.5;\n"

        "  float4 spotTextureTexel = float4( 1, 1, 1, 1 );\n"

        "  if( useSpotTexture )\n"
        "    spotTextureTexel = tex2D( spotSampler, projTexCoords );\n "

Семплер настроен на AddressU, AddressV = Clamp

Че за приколы? как убрать тайлинг?

Mr_F_ 19.10.2014 15:31

Ответ: [TrueHorror] - разработка
 
непонятно. clamp должен делать норм - может быть он где-то слетает.

Цитата:

" float4 projPos = mul(float4(p.xyz,1), spotProjMatrix);\n"
ох ох, генерация шейдера из стрингов?
я тут как раз писал на днях на эту тему:
http://ndotl.wordpress.com/2014/10/1...shader-system/

mr.DIMAS 19.10.2014 15:48

Ответ: [TrueHorror] - разработка
 
Да, clamp вообще не ставился из шейдера, я так понял если я собираю не эффект, то настройки семплера внутри кода шейдера игнорируются? Поставил вручную через SetSamplerState и все норм стало.

Про код шейдера - он у меня цельным куском - позже вытащу в файл.

mr.DIMAS 20.10.2014 00:14

Ответ: [TrueHorror] - разработка
 
Хм. Проекция текстуры пятна от источника не масштабируется. В реале когда фонарь подносишь близко к объекту то пятно пропорционально уменьшается, и наоборот. Матрицу проекции строю через D3DXMatrixLookAtRH.
Код:

void Light::BuildSpotProjectionMatrix() {
    btVector3 bEye = globalTransform.getOrigin();
    btVector3 bLookAt = bEye + ( globalTransform.getBasis() * btVector3( 0, 1, 0 )).normalize();
    btVector3 bUp = ( globalTransform.getBasis() * btVector3( 0, 0, -1 )).normalize();

    D3DXVECTOR3 dxEye( bEye.x(), bEye.y(), bEye.z() );
    D3DXVECTOR3 dxLookAt( bLookAt.x(), bLookAt.y(), bLookAt.z() );
    D3DXVECTOR3 dxUp( bUp.x(), bUp.y(), bUp.z() );

    D3DXMatrixLookAtRH( &spotProjectionMatrix, &dxEye, &dxLookAt, &dxUp );
}

Что я делаю не так?

Mr_F_ 20.10.2014 00:24

Ответ: [TrueHorror] - разработка
 
LookAt не содержит проекцию же. Тебе надо строить в точности как для камеры с перспективной проекцией - тогда будет проецироваться, как фрустумом, вблизи маленько, вдали расширено.

mr.DIMAS 20.10.2014 00:29

Ответ: [TrueHorror] - разработка
 
Вот я тупанул. Етить. 2 часа втыкал в чем дело. ммм да

mr.DIMAS 20.10.2014 00:40

Ответ: [TrueHorror] - разработка
 
Вложений: 2
Вот результат:



Текстура спота:


И кстати поставил AddressU, V = Border чтоб избежать багов когда по краям текстуры есть яркие пиксели

Mr_F_ 20.10.2014 01:19

Ответ: [TrueHorror] - разработка
 
збс, хотя ощущение что границы очень чёткие, для такого расстояния от источника.
ещё подобие отражённого света не помешало бы в идеале, можешь тупо поинт лайт (а лучше полупоинт, или типа как 180 градусный спот) ставить в центр спроецированного пятна света и красить его в цвет альбедо который под ним на экране.

Samodelkin 20.10.2014 01:48

Ответ: [TrueHorror] - разработка
 
Текстурку я бы сменил на какую-нибудь более асимметричную и с большим количеством деталей (фонарь то старый, на стекле грязь).

Даже в 2150 году фонари не идеальны: http://www.ag.ru/games/doom-3/screenshots/99703
(надо в движении смотреть -- тогда будет лучше видно много разных градаций яркости по всему световому пятну).

impersonalis 20.10.2014 02:01

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Mr_F_ (Сообщение 288119)
я у себя в игре задолбался с динамически создаваемыми объектами, большинство глюков выходило именно из-за них. в результате по максимуму зарезервировал в сцене важные сложные объекты типа всех приезжающих копов, их машин, чтобы они всегда чётко были одни и те же.

у меня трабла значительная была ещё с тем, что переменных просто миллион, каждый нпс в себе содержит добрую сотню их, а завтра я могу добавить ещё какой-нибудь float timeToStopShoutingAtDogsWhoShitUnderTrees, и мне ещё это добавлять в сейв/лоад?! а у каждого нпс с уникальным поведением/диалогами - ещё свои переменные. так что необходимо было мутить универсальную систему, которой не нужно знать ничего более имени класса, руками перебирать я бы просто обосрался.
и вот в С++ думаю разве что кодогенератором сделал на основе существующих хидеров с переменными.

тред не читал @ сразу отвечал.
А в чём проблема сериализовать объект путём тупо дампа занимаемой им памяти? Проблемы будут только со значением указателей, все же другие типы переменных должны после обратного действа адекватно восстановиться.
Альтернативное решение - намутить свой менеджер параметров. Как-то надо было реализовать класс, в котором (по мере проработки ТЗ) постоянно удаляли/добавляли кучу логически слабо связанных параметров, поэтому "тупо массив" использовать было неудобно. Что-то типа: объявляется пространство имён МоиПараметры, а внутри - безымянный enum
Код:

enum {AI_FLAG,
AI_PAR1,
BOT_VEL,
//insert new val before this line
PARNUM}

и т.п., таким образом, автоматом регистрируем легко расширяемый набор констант с уникальными кодами (соответствующие индексам). Все допустимые параметры в одном пространстве имён - опечататься нельзя: достаточно сделать квалификацию МоиПараметры:: и IDE всё подскажет. Количество памяти под параметры вычисляется на этапе компиляции, после определения значения "служебной" константы МоиПараметры::PARNUM (код очевиден - не буду приводить)
Менеджер, оперирует параметром, зная его код, скрытый от программиста интуитивным именем константы. Включать/исключать пространство имён в классы следует в зависимости от архитектуры и взаимосвязей объектов. Зато массовые операции (запись, загрузка, упаковка, распаковка - которые тоже необходимо было реализовать в моём случае) кодятся просто. Добавляется дополнительная защита от забывчивости с размерами памяти под параметры, и от опечаток в именах, и от сокрытия области видимости, исчезает проблема с "дырками" в массиве в ходе рефакторинга, уходим от конкретных значений индексов и проч.
Внутри менеджера, можно использовать быстрый контейнер (если уместно - даже просто массив), а скорость интерфейса ограничится лишь степенью обеспечиваемой безопасности (меньше проверок - быстрее работает) и "гомогенностью" типов параметров.

mr.DIMAS 20.10.2014 22:16

Ответ: [TrueHorror] - разработка
 
Как сделать ореол ( light flare ) вокруг источника света? Ну я про то если отходишь от лампы то появляется такой ореол. Единственная мысль: нарисовать квад повернутый на камеру и без записи с буфер глубины. Но как делают тру пацаны?

Mr_F_ 20.10.2014 22:20

Ответ: [TrueHorror] - разработка
 
Цитата:

нарисовать квад повернутый на камеру и без записи с буфер глубины. Но как делают тру пацаны?
да в основном так и делают, со скейлом и альфой в зависимости от дистанции можно шаманить.
и юзаешь бленд типа аддитивного или screen.

mr.DIMAS 21.10.2014 02:20

Ответ: [TrueHorror] - разработка
 
А можно ли как-нибудь спроецировать текстуру для поинт лайта, ну допустим лампа грязная и свет от нее тусклый - таким образом будут видны тени от грязи на стекле. тут что-то с кубемапами нужно городить?

Mr_F_ 21.10.2014 03:21

Ответ: [TrueHorror] - разработка
 
ага, можно кубмапой. просто юзаешь вектор света как выборку для неё.

mr.DIMAS 21.10.2014 21:38

Ответ: [TrueHorror] - разработка
 
Сделал. Записал видео - ибо на скрине будет не понятно.

Кубемапу делал с помощью тулзы от AMD. (первое что гугл выдал )
Грани кубемапы одинаковые, пока что.

Mr_F_ 21.10.2014 21:57

Ответ: [TrueHorror] - разработка
 
тебе надо кубмапу сделать, отрендерив из центра лампы чёрным по белому, чтобы она именно тень себя бросала.

mr.DIMAS 21.10.2014 22:02

Ответ: [TrueHorror] - разработка
 
я делаю общий случай с заранее подготовленными текстурами. потом добавлю тени, и отпадет необходимость делать кубмапу рендером. мне нужно получить именно эффект грязного замызганного стекла, не более.

Mr_F_ 21.10.2014 22:14

Ответ: [TrueHorror] - разработка
 
ну вообще у лампы твоей низ и верх закрыт нафиг - так что она должна светить заметно темнее с этих сторон.

mr.DIMAS 21.10.2014 22:29

Ответ: [TrueHorror] - разработка
 
Я для каждого типа ламп запилю свою кубмапу. Сделал такую текстуру просто для теста.

Samodelkin 21.10.2014 22:42

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 288352)
Сделал. Записал видео - ибо на скрине будет не понятно.

Кубемапу делал с помощью тулзы от AMD. (первое что гугл выдал )
Грани кубемапы одинаковые, пока что.

Ну вот всего лишь грязное стекло, а сразу куда живее и атмосфернее освещение стало.

Ещё в составе DX SDK есть тулза создающая DDS в том числе кубические и объёмные.

mr.DIMAS 22.10.2014 00:24

Ответ: [TrueHorror] - разработка
 
А как сделать, чтобы лучи света видно было? Ну типа в конусе спота чтобы как-бы была подсвеченная пыль, или в сфере поинта то же? Или это уже только системой частиц?

Arton 22.10.2014 00:49

Ответ: [TrueHorror] - разработка
 
Спрайты?
Спрайты с анимацией пыли и маской.

mr.DIMAS 22.10.2014 01:17

Ответ: [TrueHorror] - разработка
 
Та нет, мне нужно объемное распределение подсвеченой пылищи. Все таки походу системой частиц ваять придется.

Arton 22.10.2014 02:01

Ответ: [TrueHorror] - разработка
 
Спрайты с анимацией пыли и картой освещения? Которые обрезаются по маске из освещения.

Разве идея плоха? Мне кажется частицы здесь совсем необязательны.

Видишь звёзды внизу между планет, они сделаны спрайтами:


В движение хорошо смотрится.

Mr_F_ 22.10.2014 02:17

Ответ: [TrueHorror] - разработка
 
конусы спотов в сорс играх делали 1 билбордом с видом сбоку (крутящимся только вокруг одной оси) и одним с видом спереди, в L4D сделали покруче: многослойный фрустум из квада аля спереди + полностью боковой. но это +овердро.
ещё можно отрендерить в отдельную текстуру глубину конуса и в ещё одну - глубину флипанутого конуса, а потом в постэффекте на основе расстояния между этими двумя глубинами сделать эффект аля объёмный туман + мягко пересечь его с геометрией сцены, юзая её глубину.
вообще вариантов куча.

Arton 22.10.2014 02:23

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Mr_F_ (Сообщение 288374)
конусы спотов в сорс играх делали 1 билбордом с видом сбоку (крутящимся только вокруг одной оси) и одним с видом спереди, в L4D сделали покруче: многослойный фрустум из квада аля спереди + полностью боковой. но это +овердро.
ещё можно отрендерить в отдельную текстуру глубину конуса и в ещё одну - глубину флипанутого конуса, а потом в постэффекте на основе расстояния между этими двумя глубинами сделать эффект аля объёмный туман + мягко пересечь его с геометрией сцены, юзая её глубину.
вообще вариантов куча.

А что быстрее будет? Второй способ или частицами как хочет mr.DIMAS?

Цитата:

конусы спотов в сорс играх делали 1 билбордом с видом сбоку (крутящимся только вокруг одной оси) и одним с видом спереди
Кажется там даже некоторые провода так сделаны.

Mr_F_ 22.10.2014 02:28

Ответ: [TrueHorror] - разработка
 
с частицами тоже вариант, но может тормозно выйти из-за овердро, если я правильно понял идею (понаставить кучу частиц и на каждой вычислять свет спота?)

mr.DIMAS 22.10.2014 21:16

Ответ: [TrueHorror] - разработка
 
будет ли прирост производительности если все шейдерные константы замапить напрямую в регистры и потом устанавливать их через вызовы setvertexshaderconstant/setpixelshaderconstant? и как быть например с таким:

Код:

float4x4 worldViewProjection;
float opacity;
float brightness;

например я делаю так

Код:

float4x4 worldViewProjection : register( c0 );
float opacity : register( c5 );
float brightness : register( c6 );

но каждый регистр может содержать четыре флоата, таким образом впустую пропадают куски регистров с5,с6.

кароч расскажите че да как.

mr.DIMAS 23.10.2014 03:14

Ответ: [TrueHorror] - разработка
 
и еще вопрос вдогонку: как мне отрисовывать фонарик перед камерой, так чтобы он не загораживался другими объектами - кароч поверх всех? вроде бы ответ прост: нарисуй все объекты, затри буфер глубины, и нарисуй фонарик. но нифига! буфер глубины у меня используется в дефереде для оптимизаций буфером трафарета. поэтому это не вариант. форвард рендер у меня в зачаточном состоянии - рисует только полупрозрачные объекты и без освещения. я уже перепробовал рисовать фонарик после всех с отключенной записью в буфер глубины, с отключенным буфером вообще. получается шлак - полигоны перемешиваются в кашу - один на другой накладываются. че делать?
в коде дума3 нашел интересный код

Код:

/*
===============
RB_EnterModelDepthHack
===============
*/
void RB_EnterModelDepthHack( float depth ) {
    qglDepthRange( 0.0f, 1.0f );

    float    matrix[16];

    memcpy( matrix, backEnd.viewDef->projectionMatrix, sizeof( matrix ) );

    matrix[14] -= depth;

    qglMatrixMode(GL_PROJECTION);
    qglLoadMatrixf( matrix );
    qglMatrixMode(GL_MODELVIEW);
}

/*
===============
RB_LeaveDepthHack
===============
*/
void RB_LeaveDepthHack() {
    qglDepthRange( 0, 1 );

    qglMatrixMode(GL_PROJECTION);
    qglLoadMatrixf( backEnd.viewDef->projectionMatrix );
    qglMatrixMode(GL_MODELVIEW);
}

может он как-то поможет?

update. перевел его на dx. и он работает, это классно.

вот мой вариант:

Код:

void Camera::EnterDepthHack( float depth )
{
    if( !inDepthHack ) {
        depthHackMatrix = projection;
    }
    inDepthHack = true;
    projection._43 -= depth;
    CalculateInverseViewProjection();
}

void Camera::LeaveDepthHack()
{
    inDepthHack = false;
    projection = depthHackMatrix;
    CalculateInverseViewProjection();
}

при рендере фонарика ставлю EnterDepthHack( 0.1 ) и все! он рендерится поверх всего и не "проваливается" ни в какие объекты.

mr.DIMAS 23.10.2014 21:02

Ответ: [TrueHorror] - разработка
 
взялся за тени. пока что делаю только для спота - ибо проще. что делаю:
1) создал текстуру шадоумапы - R32F
2) отрисовал туда глубину сцены из положения и направления спота с fov равным углу при вершине конуса спота.

как дальше быть при выборке из шадоумапы при учете освещения? как спроецировать текстурные координаты?

Mr_F_ 24.10.2014 02:55

Ответ: [TrueHorror] - разработка
 
проецируешь так же, как с картинкой фонарика.
дальше сравниваешь глубину (Z полученный при проекции): ближе текстуры? на свету. дальше? в тени. нужно ещё маленький оффсет прибавлять туда-сюда перед сравнением, а то точность не идеальна.

mr.DIMAS 25.10.2014 22:44

Ответ: [TrueHorror] - разработка
 
чет фигня получается если проецировать как для картинки фонарика, тень вращается вместе с камерой. че делать?

Mr_F_ 25.10.2014 23:02

Ответ: [TrueHorror] - разработка
 
не понял как вращается.
короче рендеришь тени с камеры, привязанной к персу (то бишь локальная ворлд матрица камеры должна домножаться на ворлд матрицу перса), и проецируешь матрицей той же самой камеры.

mr.DIMAS 25.10.2014 23:11

Ответ: [TrueHorror] - разработка
 
wat? а где тогда используется матрица спота?

Mr_F_ 25.10.2014 23:56

Ответ: [TrueHorror] - разработка
 
ну и пятно спота той же камерой проецируешь, что и тени, нафига тебе 2 разные матрицы, если это всё проецируется с одного лайта?

mr.DIMAS 26.10.2014 00:15

Ответ: [TrueHorror] - разработка
 
Я немного упорот сегодня поэтому, все еще разок с начала.

Мои действия:
1) Создаю viewProjection матрицу для спота.
2) С ее помощью отрисовываю сцену - получаю шадоумапу.
3) При расчете освещения беру восстановленую позицию( по глубине ), и домножаю ее на матрицу viewProjection спота, делаю выборку из текстуры
...

С текстурой пятна все хорошо, с тенями нет - они вращаются при повороте камеры.

Можно объяснение для даунов пжлста.

Mr_F_ 26.10.2014 00:47

Ответ: [TrueHorror] - разработка
 
запиши видео чтоли, не представляю как оно вращается

mr.DIMAS 26.10.2014 01:09

Ответ: [TrueHorror] - разработка
 
здесь только буфер глубины показан, без расчета теней

[УДАЛЕНО]

еще глянь код чтоли, в подписи у меня есть ссылка на репозиторий, файлы ShadowMap.h и DeferredRenderer.cpp

mr.DIMAS 26.10.2014 12:15

Ответ: [TrueHorror] - разработка
 
можешь просто объяснить последовательность действий? только поподробней

Mr_F_ 26.10.2014 13:15

Ответ: [TrueHorror] - разработка
 
да вроде всё правильно делаешь, в коде долго разбираться.
выведи в маленький вьюпорт сбоку содержимое шадоумапы подскейленное, чтобы его хорошо видно было и посмотри, что там с проекцией творится, видит ли фонарик то, что должен видеть.

mr.DIMAS 26.10.2014 14:47

Ответ: [TrueHorror] - разработка
 
Вложений: 1
я опять вляпался по-колено в z-буфер. чистить и записывать в него мне его нельзя, следовательно нормально шадоумапу я нарисовать не смогу, если я чищу з-буфер у меня слетают оптимизации трафаретом, но получается хорошая шадоумапа. на скрине результат отрисовки с

Код:

        g_device->SetRenderState( D3DRS_ZENABLE, FALSE );
        g_device->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );

а баги у меня были из-за

Код:

        g_device->SetRenderState( D3DRS_ZENABLE, TRUE );
        g_device->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );

че делать? сортировать объекты по глубине? это как-то жирно, depth-peeling? кароч я постоянно натыкаюсь на z-буфер. >>:(


Часовой пояс GMT +4, время: 18:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot