From 900a18349a9d72a988c806fa00afdf0390366f66 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 23 Sep 2023 09:31:46 -0400 Subject: [PATCH] Mostly finish shpk article --- content/_index.md | 23 ++++++++++++----------- content/format/shpk.md | 11 ++++++++++- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/content/_index.md b/content/_index.md index d7a2ab6..3327b75 100644 --- a/content/_index.md +++ b/content/_index.md @@ -2,25 +2,25 @@ This is my collection of everything I know, and that I collected on FFXIV inner Developers, please look at the end of each page for example implementations that I know of. I find it incredibly useful to look at them, especially if I'm stuck on implementing something. If you have a project that you want to add to the list or suggest any kind of edit, don't hesitate to [email me](https://redstrate.com/about) or [fix it yourself](https://git.sr.ht/~redstrate/docs.xiv.zone)! -## Executables +# Executables **Note:** These are actually referring to their 64-bit counterparts, e.g. `ffxivboot.exe` is `ffxivboot64.exe`. -### Boot +## Boot * [ffxivboot.exe](executable/ffxivboot) - Launcher for the launcher. * [ffxivupdater.exe](executable/ffxivupdater) - Game patcher. * [ffxivlauncher.exe](executable/ffxivlauncher) - Boot/game launcher. -### Game +## Game * [ffxiv.exe](executable/ffxiv) - Game executable. -### Other +## Other * [ffxivinstaller.exe](executable/ffxivinstaller) - Retail game client installer. -## Concepts/Techniques +# Concepts/Techniques * [Logging into Official Servers](concept/logging-in-official) - Logging into the official game servers. * [Logging into Sapphire](concept/logging-in-sapphire) - Logging into unofficial Sapphire servers. @@ -28,29 +28,30 @@ Developers, please look at the end of each page for example implementations that * [Equipment](concept/equipment) - All about reading equipment data ala TexTools. * [Dalamud](concept/dalamud) - Launching Dalamud without the help of XIVQuickLauncher. -## File Formats +# File Formats -### Excel +## Excel * [.exd](format/exd) - Excel data. * [.exh](format/exh) - Excel header. * [.exl](format/exl) - Excel list. -### Graphics +## Graphics * [.mdl](format/mdl) - Game model. +* [.shpk](format/shpk) - Shader packages. -### SqPack +## SqPack * [.index/index2](format/sqpack-index) - Game Data Index file. * [.dat](format/sqpack-dat) - Compressed game data. -### Other +## Other * [.patch](format/patch) - ZiPatch files. * [.fiin](format/fiin) - File info. -## Credits +# Credits This wouldn't be possible without all of the great people who open-source their work, and everyone else in the FFXIV community! diff --git a/content/format/shpk.md b/content/format/shpk.md index d6b99db..942ddcf 100644 --- a/content/format/shpk.md +++ b/content/format/shpk.md @@ -2,10 +2,14 @@ title: "SHPK" --- +**Note**: Resource and scalar parameters are not documented yet. + These are "shader packages" or a collection of vertex and pixel shaders. A good example is _"character.shpk"_ which contains - you guessed it - character shaders. # Header Structure +All values are in **little-endian**. + | Offset | Type | Purpose | | ------ | ----- | ------ | | 0x00 | 4 character ASCII string | Magic, should read "ShPk". | @@ -25,4 +29,9 @@ Getting the shader bytecode from a shader package is easy, it begins at the shad Then, collect a WORD (4 bytes) at a time and putting them into a buffer. Keep doing this until you hit the next `DXBC` ASCII and you found a complete shader bytecode. Rinse and repeat and you should have `N` shaders where `N = number of vertex shaders + number of pixel shaders`. -The format of this shader bytecode is nothing special, it's simply DXBC (the bytecode format used by DirectX before DXIL). If you want to reverse this into something usable, like SPIR-V, HLSL or GLSL then you need to find a decompiler. +The format of this shader bytecode is nothing special, it's DXBC (the bytecode format used by DirectX before DXIL.) If you want to reverse this into something usable, like SPIR-V, HLSL or GLSL then you need to find a decompiler. + +# Alternative Implementations + +* [SaintCoinach (C#)](https://github.com/xivapi/SaintCoinach/blob/master/SaintCoinach/Graphics/ShPk/ShPkFile.cs) +* [physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/shpk.rs)