Привет читателям. В прошлом году я опубликовал свой хобби-проект Красный Омега PS2 эмулятор. Идея была в адаптации управления оригинального эмулятора PCSX2 для игр на Surface Pro через Touch Screen.
Оригинальный код PCSX2 эмулятора был переписан в форме модуля DLL, загружаемый в C# код с графическим интерфейсом на WPF. Проект получился работоспособным и удачным — Final Fantasy X и Final Fantasy XII пошли «на ура». Но полгода назад я наткнулся на ссылку на Valkyria Chronicles 4 в Steam. Первую Valkyria Chronicles я покупал на диске и мне «зашла», но есть вопрос — где вторая и третья!?! Ответ нашёлся быстро — эти продолжения выходили только на игровых консолях. Самой доступной оказались версии для PlayStation Portable — через PPSSPP эмулятор. На смартфоне неплохо, но на Surface Pro мне не понравилось управление через Touch. Да и переключаться с Omega Red на PPSSPP, и обратно не охота. И тут возникла «безумная» идея — переписать оригинальный код PPSSPP в форме модуля DLL!!! И превратить Omega Red в ПЛАТФОРМУ для игр PlayStation 2 и PlayStation Portable!!!
Сказать легко, но сделать намного сложнее. Оригинальный PPSSPP эмулятор разрабатывается как Open Source проект и доступен в форме полного кода для изучения и модификации. Код интересен и может быть запущен на множестве графических API: OpenGL, DirectX9, DirectX11, Vulkan. В добавок, он имеет встроенную GUI. Но архитектура PPSSPP более «ясная» чем у PCSX2 — больше модульности и зависимости упрощены. Главным ключём к реализации моей идеи оказалась возможность загрузки игрового диска и сохранения в форме аргумента для программы. Решение элементарное — переписать входную функцию EXE в ЭКСПОРТИРУЕМУЮ функцию DLL. Конечно, возникнут проблемы с созданием второго «окна», перенаправлением выхода графического рендерера на WPF графический контекст, подключением Touch кода, и т.д. и т.п., но всё это я уже решал, когда переписывал код для PCSX2 — работоспособные шаблоны уже есть.
Каков результат — решение работает! Удалось объединить два столь разных эмулятора в одно решение с бесшовным переключением между играми для разных эмуляторов. Результат можно оценить на видео:
В дополнение, я хотел бы упомянуть следующие изменения, по сравнению с первым релизом Красный Омега PS2 эмулятор:
1. Изменена цветовая схема — в комментариях было указано неудобство от цветовой гаммы интерфейса — красного. Странное неудобство — но я решил добавить инвертированную гамму «Синий»:
![image](https://www.codeproject.com/KB/Emulation/1251671/5f0f88d4-03ad-4819-8e06-095d44bc2f22.Png)
2. Тесселяция — для игр на PCSX2 добавлена функция «Tessellation» из DirectX 11 — это функция позволяет увеличить количество полигонов для моделей:
![image](https://www.codeproject.com/KB/Emulation/1251671/8062ac87-4146-4073-a613-7376aa1424a6.Jpeg)
Тесселяция выбирается из опции «Rendering schema»:
![image](https://www.codeproject.com/KB/Emulation/1251671/Tessellated.png)
DEFAULT
![image](https://www.codeproject.com/KB/Emulation/1251671/0fe8e614-fb7b-4819-b0a7-70c8457f9152.Jpeg)
TESSELLATED
![image](https://www.codeproject.com/KB/Emulation/1251671/55df9748-bb0f-4af7-8480-e39f58d008a3.Jpeg)
DEFAULT
![image](https://www.codeproject.com/KB/Emulation/1251671/22d4765c-4ad9-46ec-8f1c-d48f42bb3376.Jpeg)
TESSELLATED
![image](https://www.codeproject.com/KB/Emulation/1251671/52018042-87bc-4b2d-95b2-75bdf12a3927.Jpeg)
3. FXAA — для игр на PCSX2 добавлена функция «Включить FXAA» для удаления «Ступенек» по границам полигонов — решение работает не идеально, но работает:
![image](https://www.codeproject.com/KB/Emulation/1251671/Working/EnableFXAA.png)
4. Быстрое сохранение — сохранение состояния эмулятора одной командой:
![image](https://www.codeproject.com/KB/Emulation/1251671/QuickSaving.png)
5. Контроль громкости:
![image](https://www.codeproject.com/KB/Emulation/1251671/AudioControl.png)
В настоящий момент программа доступна по ссылке: Omega Red и представлена на GitHub: OmegaRed
Оригинальный код PCSX2 эмулятора был переписан в форме модуля DLL, загружаемый в C# код с графическим интерфейсом на WPF. Проект получился работоспособным и удачным — Final Fantasy X и Final Fantasy XII пошли «на ура». Но полгода назад я наткнулся на ссылку на Valkyria Chronicles 4 в Steam. Первую Valkyria Chronicles я покупал на диске и мне «зашла», но есть вопрос — где вторая и третья!?! Ответ нашёлся быстро — эти продолжения выходили только на игровых консолях. Самой доступной оказались версии для PlayStation Portable — через PPSSPP эмулятор. На смартфоне неплохо, но на Surface Pro мне не понравилось управление через Touch. Да и переключаться с Omega Red на PPSSPP, и обратно не охота. И тут возникла «безумная» идея — переписать оригинальный код PPSSPP в форме модуля DLL!!! И превратить Omega Red в ПЛАТФОРМУ для игр PlayStation 2 и PlayStation Portable!!!
Сказать легко, но сделать намного сложнее. Оригинальный PPSSPP эмулятор разрабатывается как Open Source проект и доступен в форме полного кода для изучения и модификации. Код интересен и может быть запущен на множестве графических API: OpenGL, DirectX9, DirectX11, Vulkan. В добавок, он имеет встроенную GUI. Но архитектура PPSSPP более «ясная» чем у PCSX2 — больше модульности и зависимости упрощены. Главным ключём к реализации моей идеи оказалась возможность загрузки игрового диска и сохранения в форме аргумента для программы. Решение элементарное — переписать входную функцию EXE в ЭКСПОРТИРУЕМУЮ функцию DLL. Конечно, возникнут проблемы с созданием второго «окна», перенаправлением выхода графического рендерера на WPF графический контекст, подключением Touch кода, и т.д. и т.п., но всё это я уже решал, когда переписывал код для PCSX2 — работоспособные шаблоны уже есть.
Каков результат — решение работает! Удалось объединить два столь разных эмулятора в одно решение с бесшовным переключением между играми для разных эмуляторов. Результат можно оценить на видео:
В дополнение, я хотел бы упомянуть следующие изменения, по сравнению с первым релизом Красный Омега PS2 эмулятор:
1. Изменена цветовая схема — в комментариях было указано неудобство от цветовой гаммы интерфейса — красного. Странное неудобство — но я решил добавить инвертированную гамму «Синий»:
2. Тесселяция — для игр на PCSX2 добавлена функция «Tessellation» из DirectX 11 — это функция позволяет увеличить количество полигонов для моделей:
Тесселяция выбирается из опции «Rendering schema»:
![image](https://www.codeproject.com/KB/Emulation/1251671/Tessellated.png)
DEFAULT
TESSELLATED
DEFAULT
TESSELLATED
3. FXAA — для игр на PCSX2 добавлена функция «Включить FXAA» для удаления «Ступенек» по границам полигонов — решение работает не идеально, но работает:
![image](https://www.codeproject.com/KB/Emulation/1251671/Working/EnableFXAA.png)
4. Быстрое сохранение — сохранение состояния эмулятора одной командой:
![image](https://www.codeproject.com/KB/Emulation/1251671/QuickSaving.png)
5. Контроль громкости:
![image](https://www.codeproject.com/KB/Emulation/1251671/AudioControl.png)
В настоящий момент программа доступна по ссылке: Omega Red и представлена на GitHub: OmegaRed
8street
Интересная фишка с теселляцией, но видимо бесполезная. Это видно на границе волос и плеч. Всё так и осталось угловатым.
Xirexel Автор
Согласен — для тесселяции нужна ещё карта высоты. В принципе, карту высоты можно генерировать по нормалям вершин, но мне так и не удаётся извлечь эти данные из рендерера — хотя по идеи они должны быть — PS2 поддерживает вершинное освещение по Фонгу.