diff --git a/examples/jsm/exporters/GLTFExporter.js b/examples/jsm/exporters/GLTFExporter.js index f1a9831e72cb18..c995d1b03400d0 100644 --- a/examples/jsm/exporters/GLTFExporter.js +++ b/examples/jsm/exporters/GLTFExporter.js @@ -976,7 +976,17 @@ class GLTFWriter { } - const byteLength = getPaddedBufferSize( count * attribute.itemSize * componentSize ); + let byteStride = attribute.itemSize * componentSize; + + if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) { + + // Each element of a vertex attribute MUST be aligned to 4-byte boundaries + // inside a bufferView + byteStride = Math.ceil( byteStride / 4 ) * 4; + + } + + const byteLength = getPaddedBufferSize( count * byteStride ); const dataView = new DataView( new ArrayBuffer( byteLength ) ); let offset = 0; @@ -1041,6 +1051,12 @@ class GLTFWriter { } + if ( ( offset % byteStride ) !== 0 ) { + + offset += byteStride - ( offset % byteStride ); + + } + } const bufferViewDef = { @@ -1056,7 +1072,7 @@ class GLTFWriter { if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) { // Only define byteStride for vertex attributes. - bufferViewDef.byteStride = attribute.itemSize * componentSize; + bufferViewDef.byteStride = byteStride; }