|
@@ -982,7 +982,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;
|
|
|
|
|
@@ -1047,6 +1057,12 @@ class GLTFWriter {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( ( offset % byteStride ) !== 0 ) {
|
|
|
+
|
|
|
+ offset += byteStride - ( offset % byteStride );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
const bufferViewDef = {
|
|
@@ -1062,7 +1078,7 @@ class GLTFWriter {
|
|
|
if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {
|
|
|
|
|
|
// Only define byteStride for vertex attributes.
|
|
|
- bufferViewDef.byteStride = attribute.itemSize * componentSize;
|
|
|
+ bufferViewDef.byteStride = byteStride;
|
|
|
|
|
|
}
|
|
|
|