FLVER vertex formats
FLVER layouts describe the bytes of a vertex stream. A member’s semantic identifies its role, while its type describes its packing; the same type can be decoded differently for a normal, bone index or texture input. Observed
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | member count | Proven | |
| 0x4 | 8 | bytes = 0 | reserved | Proven | |
| 0xC | 4 | u32 | members offset | Proven |
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | stream descriptor | Sourced | Ordinary layouts use a stream word; SpeedTree splits it into stream u16 and modifier u16. |
| 0x4 | 4 | u32 | byte offset within stream | Proven | |
| 0x8 | 4 | u32 | member type | Proven | |
| 0xC | 4 | u32 | semantic | Proven | |
| 0x10 | 4 | u32 | semantic index | Proven |
| Semantic | Role | Confidence |
|---|---|---|
| 0 | Position | Observed |
| 1 | Bone weights | Observed |
| 2 | Bone indices | Observed |
| 3 | Normal, with a possible rigid bone index in W | Observed |
| 5 | Texture-coordinate input, also used for layer weights and pivots | Observed |
| 6 | Tangent | Observed |
| 7 | Bitangent | Observed |
| 10 | Vertex colour | Observed |
The layout records above are checked across the whole-install reference population: 14,459 Sekiro and 22,050 Elden Ring models. The reference refuses 119 Elden Ring SpeedTree models; those streams have a separate program-execution check. One Sekiro archive entry is unreadable before model inspection. Proven · whole-install reference population
Types and consumer decoding
Section titled “Types and consumer decoding”The table covers the types the current real-data reader decodes; a supported type is not evidence that every game uses it. The additional enum values below are community documentation. Observed
| Type | Bytes | Interpretation in the checked semantic | Confidence |
|---|---|---|---|
0x01 Float2 |
8 | UV: two float lanes | Observed |
0x02 Float3 |
12 | Position or normal XYZ; UV: three float lanes | Observed |
0x03 Float4 |
16 | Four floats; UV packs two coordinate pairs; position W is zero in checked ordinary data | Observed |
0x10 Color |
4 | Weights: signed bytes / 127; colour: unsigned bytes / 255; UV: two signed shorts / 2048 | Observed |
0x11 UByte4 |
4 | Bone indices: four bytes; UV: two signed shorts / 2048 | Observed |
0x12 Byte4 |
4 | UV: two signed shorts / 2048; normal: bytes 3,2,1 as signed / 127, byte 0 is W | Observed |
0x13 UByte4Norm |
4 | UV or colour: four unsigned bytes / 255; weights: unsigned bytes / 255 | Observed |
0x15 Short2 |
4 | UV: two signed shorts / 2048 | Observed |
0x16 Short4 |
8 | UV: two signed-short coordinate pairs / 2048; weights: four signed shorts / 32767 | Observed |
0x18 UShort4 |
8 | Bone indices: four unsigned 16-bit values | Observed |
0x1A Short4Norm |
8 | Weights, normals and tangents: signed shorts / 32767; normal W remains an integer | Observed |
0x2D Half2 |
4 | SpeedTree: two IEEE half floats | Observed · Elden Ring |
0x2E Half4 |
8 | UV semantic: four IEEE half floats; ordinary normal semantic: unsigned XYZ biased by 32767, signed integer W | Observed |
0x2F Byte4E |
4 | Bone indices: four bytes; normal and tangent packing follows the byte rule below | Observed |
0x00 Float1 |
4 | One float | Sourced · SoulsFormatsNEXT |
0x14 Byte4Norm |
4 | Four normalized signed bytes | Sourced · SoulsFormatsNEXT |
0x17 UShort2 |
4 | Two unsigned shorts | Sourced · SoulsFormatsNEXT |
0xF0 EdgeCompressed |
1 | Edge compression described by face-set members | Sourced · SoulsFormatsNEXT |
For normal and tangent semantics of types 0x10, 0x11, 0x13 and 0x2F, a byte component is
(b - 127) * r, where r is the float with bits 0x3C010204. This is the shader’s rounded reciprocal of 127;
division by 127 can differ by one ULP. A normal’s W remains its raw bone-index byte. Observed
Short coordinates and normalized weights
Section titled “Short coordinates and normalized weights”The vertex programs take Short2 texture inputs as integers and multiply by 1/2048. UByte4Norm inputs instead
arrive as float TEXCOORDn.xyzw and pass through without that scaling: Elden Ring’s
M[AMSN_V][Mb3][Ov_N]_Gbuf.vpo and Sekiro’s M_MultipleGround__Gbuf.vpo show the distinction.
Observed
SoulsFormats reads the four bytes of a 0x13 UV member as two signed shorts / 2048. SoulsFormatsNEXT preserves the
four normalized values but splits them into two UV pairs. Neither representation describes the shader’s one
four-lane input directly. Sourced · SoulsFormatsNEXT
Repeated UV attributes follow stream order; tangent semantic indices can be sparse, so their index is not necessarily their position in an array. Observed
A colour member is COLOR0 or COLOR1 by its semantic index (the member’s word at +16), not by its position among the
colours. Observed · Elden Ring Most of Stormveil’s map meshes store a single colour member and give it index 1: in
m10_00_00_00’s map piece m002002, 18 of 19 meshes do, with the value (1, 0, 0, 1) at every vertex, and m10_00_046 is the one
that stores both 0 and 1. Observed · Elden Ring · every mesh of that map piece M[AMSN_V]_Gbuf‘s vertex program reads
COLOR1 and no COLOR0. Observed · Elden Ring A reader that takes the first stored colour as COLOR0 leaves that
program’s COLOR1 unset; with a zero colour there, the courtyard’s floor slabs (m002002 and m002012) draw black.
Observed · Elden Ring · a reimplementation of the program, the Stormveil gate Over the meshes of a region of Stormveil the
programs’ colour reads find COLOR1 stored 2,260 times and COLOR0 78 times, with none missing.
Observed · Elden Ring · one region of m10_00_00_00 The cliff material aet000_052_a of the open world uses the
M[AMSN_V][Mb4][3Mask][Far_AN]_Gbuf vertex program, whose inputs are POSITION0, NORMAL0, TANGENT0, COLOR1, TEXCOORD0
and the instance id; it passes COLOR1.x on to its pixel program as TEXCOORD4.z. Observed · Elden Ring · the program’s code
The programs of M[AMSN_V][Ov_N][Mb4_ColorAdjust][3Mask_ch18] read only COLOR1.x and COLOR1.w, and COLOR1.w only on
the branch that the material’s snp_0_bool_0 (the cbMtdParam word at +144) switches on. Folding that word to 0 in the
program leaves COLOR1.x as the only lane it reads. Observed · Elden Ring · a dependency trace of the program’s code
Stormveil’s ColorAdjust materials m10_00_113, m10_00_440, m10_00_450, m10_00_604, m10_00_680 and m10_00_681 set
the word to false, so their draws use only the first lane of COLOR1.
Observed · Elden Ring · the materials of one region of m10_00_00_00 Whether the four Mb3_ColorAdjust materials
of that region (m10_00_869, 870, 873 and 874) follow the same rule has not been traced.
A UV set the vertex program reads is not necessarily one the draw uses. only in Sekiro In the Wolf’s default head and
the twelve Sekiro material variants (three distinct pixel programs) whose vertex programs compute outputs from the
third UV set, no pixel output lane (240 in all) and no discard depends on it: the pixel programs do not read the
two lanes that carry it. The Fur program reads only the third lane of that input register, which carries COLOR1.
Observed · Sekiro · a dependency trace of the outputs of those twelve variants
In Elden Ring the number of UV attributes a mesh stores (a Float4 or Short4 member counts as two, a Half4 pivot as one)
mostly follows its shader. Of the 76,822 meshes whose material has a MATBIN, the meshes of 443 of the 481 shader stems all
store the same count; the other 38 stems, mostly M[AMSN_V] variants, have meshes with one, two and three.
Proven · every mesh of the install with a MATBIN material, without the DLC archive pair
How many attributes of each kind a vertex holds, over every FLVER the archives store as an entry or as a member of a
top-level BND4 binder: Sekiro’s 14,459 models (166,873,569 vertices) and Elden Ring’s 22,169 models (324,042,558
vertices). Entries stored over 256 MiB are not read, nor is one Sekiro entry whose DCX envelope the reader refuses; no
FLVER is refused. A UV attribute is one decoded four-lane value; the 0x13 columns count only the normalized-byte
members among them.
| Attributes a vertex holds | UV (Sekiro) | UV (Elden Ring) | 0x13 UV members (Sekiro) |
0x13 UV members (Elden Ring) |
Tangents (Sekiro) | Tangents (Elden Ring) | Colours (Sekiro) | Colours (Elden Ring) |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 712 | 93,568,599 | 233,709,961 | 41,746,830 | 57,234 | 40,906,598 | 1,219,968 |
| 1 | 81,437,549 | 191,305,507 | 13,634,708 | 80,268,043 | 124,451,716 | 314,976,632 | 124,659,947 | 310,859,158 |
| 2 | 20,838,573 | 109,753,690 | 6,377,043 | 9,542,189 | 650,807 | 8,509,680 | 1,307,024 | 11,963,432 |
| 3 | 10,794,264 | 15,838,052 | 818,674 | 306,041 | 24,216 | 499,012 | 0 | 0 |
| 4 | 1,177,797 | 6,405,513 | 399,113 | 175,579 | 0 | 0 | 0 | 0 |
| 5 | 515,941 | 307,685 | 0 | 40,745 | 0 | 0 | 0 | 0 |
| 6 | 0 | 369,346 | 52,075,432 | 0 | 0 | 0 | 0 | 0 |
| 7 | 34,013 | 42,459 | 0 | 0 | 0 | 0 | 0 | 0 |
| 8 | 52,075,432 | 19,594 | 0 | 0 | 0 | 0 | 0 | 0 |
No vertex holds more than eight UV attributes, three tangents or two colours. Sekiro’s 52,075,432 vertices with eight
UV attributes (31 % of its vertices) are the ones that hold six 0x13 members: the same count. Observed[a census of
every model the archives hold as an entry or top-level binder member]
Half4 pivots
Section titled “Half4 pivots”For the checked vegetation UV-semantic Half4 members, XYZ is a model-space pivot and W is zero. A vertex program transforms the pivot as a point, including instance translation; it is not a signed-short texture coordinate. Observed
The whole-install attribute inventory records these pivots on 306 Sekiro meshes (978,040 vertices) and 1,586 Elden Ring meshes (5,301,513 vertices), with SpeedTree’s stored members handled separately. The respective maximum absolute components are 487.75 and 2,118. Proven · whole-install attribute inventory
W is zero in every value of every Half4 UV member outside SpeedTree models: 978,040 values in Sekiro and 5,301,513 in Elden Ring. Proven · every FLVER member of a top-level BND4 binder of the archives: 14,459 Sekiro models, 22,169 Elden Ring models A consumer can therefore read the member as a point (XYZ, W 0) without losing a stored lane.
A UV member’s semantic index is its ordinal among the mesh’s UV members, not the storage slot it decodes into (a Float4
or 0x16 member fills two slots): of Elden Ring’s 127,550 UV members (counted once per mesh that uses the layout), all
but 1,712 follow the ordinal, and those are 1,708 0x13 members and 4 Half4 members of SpeedTree models; of Sekiro’s
131,998, all but 4 0x13 members do. Proven · the same models
In Sekiro the Half4 members are all at semantic index 2, in the 24 Translucency_Pivot material definitions (for
example M[m10_00]_Translucency_Pivot_Parent1.mtd); in Elden Ring 319 of 12,974 definitions have one, for example
AEG001_251.matxml at index 3. No definition’s meshes store a Half4 member and another type at the same semantic
index; 6 Elden Ring and 4 Sekiro definitions store 0x12 beside 0x13 at index 1. Proven · the same models
What the game binds
Section titled “What the game binds”only in Sekiro Sekiro draws a model from its FLVER’s vertex buffers as stored: each draw binds the file’s data block (one GPU buffer) at a vertex buffer’s offset, with an input layout whose elements sit at the members’ offsets. Each member type arrives in one Direct3D format, whatever the draw: Observed · Sekiro · every layout member of the 5,357 model draws of five frames at the Ashina Castle gate
| Type | Semantics bound | Direct3D input format | Program input | Confidence |
|---|---|---|---|---|
0x02 Float3 |
position (POSITION0, and POSITION1 of the third stream of skinned meshes) |
R32G32B32_FLOAT |
float | Observed · Sekiro |
0x11 UByte4 |
normal, tangent, bitangent (BINORMAL), bone indices |
R8G8B8A8_UINT |
uint, unpacked by the program | Observed · Sekiro |
0x13 UByte4Norm |
colour (COLOR1), UV indices 1 to 6, bone weights |
R8G8B8A8_UNORM |
float | Observed · Sekiro |
0x15 Short2 |
UV 0 and 1 | R16G16_SINT |
int | Observed · Sekiro |
0x16 Short4 |
UV 0 (two coordinate pairs) | R16G16B16A16_SINT |
int | Observed · Sekiro |
The other types of the table above do not occur in these frames’ meshes. Observed · Sekiro The vertex programs
unpack the integers as the table above has it: the normal and tangent as (u - 127) * 0.007874 (each lane, the
tangent’s W too), the UV as itof(s) * scroll.xy * 0.000488 + scroll.zw with the
texture scroll vector of its set, and the normal’s W as an integer that,
added to the instance’s matricesData word, selects the object matrix (three rows of cbObjMatrix) a static mesh’s vertex follows.
Observed · Sekiro · the vertex programs of the frames’ static and skinned meshes The skinning programs divide the
four weights by their sum (at least 0.001) before blending; the stored weight bytes of the frames’ skinned meshes sum to
252 to 255, so the weights as decoded are not exactly normalised. Observed[236,561 vertices of the skinned meshes of one
frame]{games=“sekiro”}
Sekiro’s input layouts confirm the five types above in the semantics listed; the other types, and every type in Elden Ring, have no consumer check beyond the program readings above. The name Half4 alone does not establish half-float decoding for every semantic. Unknown