Skip to content

Commit c122b5c

Browse files
authored
fix: Fix alignment of integer vertex attributes (#408)
1 parent 12f00a3 commit c122b5c

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

src/exporters/GLTFExporter.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,13 @@ class GLTFWriter {
10241024
componentSize = 4
10251025
}
10261026

1027-
const byteLength = getPaddedBufferSize(count * attribute.itemSize * componentSize)
1027+
let byteStride = attribute.itemSize * componentSize
1028+
if (target === WEBGL_CONSTANTS.ARRAY_BUFFER) {
1029+
// Each element of a vertex attribute MUST be aligned to 4-byte boundaries
1030+
// inside a bufferView
1031+
byteStride = Math.ceil(byteStride / 4) * 4
1032+
}
1033+
const byteLength = getPaddedBufferSize(count * byteStride)
10281034
const dataView = new DataView(new ArrayBuffer(byteLength))
10291035
let offset = 0
10301036

@@ -1065,6 +1071,9 @@ class GLTFWriter {
10651071

10661072
offset += componentSize
10671073
}
1074+
if (offset % byteStride !== 0) {
1075+
offset += byteStride - (offset % byteStride)
1076+
}
10681077
}
10691078

10701079
const bufferViewDef = {
@@ -1077,7 +1086,7 @@ class GLTFWriter {
10771086

10781087
if (target === WEBGL_CONSTANTS.ARRAY_BUFFER) {
10791088
// Only define byteStride for vertex attributes.
1080-
bufferViewDef.byteStride = attribute.itemSize * componentSize
1089+
bufferViewDef.byteStride = byteStride
10811090
}
10821091

10831092
this.byteOffset += byteLength

0 commit comments

Comments
 (0)