Skip to content

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

Buffer layout16 bytes100% known
ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x04u32member countProven
0x48bytes = 0reservedProven
0xC4u32members offsetProven
Layout member20 bytes80% known
ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x04u32stream descriptorSourcedOrdinary layouts use a stream word; SpeedTree splits it into stream u16 and modifier u16.
0x44u32byte offset within streamProven
0x84u32member typeProven
0xC4u32semanticProven
0x104u32semantic indexProven
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

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

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]

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

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”}

Does every declared member type have a consumer-verified meaning?

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