Strange output on Array3D(3) toArray()
Nessuno ha ancora preso questa issue.
- Lingua principale
- JavaScript
- Stelle
- 15.5k
- Fork
- 663
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
What is wrong?
When using a kernel to draw a CPU Array3D(3) into a texture and then converted back using toArray(), the resulting array is very strange and wrong, with some values being correct and others being either duplicated or entirely incorrect.
Where does it happen?
In GPU.js, running on my Windows 7 PC, headlessgl in node.js v12.18.1.
How do we replicate the issue?
Create a 3D array and assign each value set to its index in the array...
e.g.,
const gridSize = 8;
const buffer = [];
for (let x = 0; x < gridSize; x++) {
let currXArr = [];
buffer.push(currXArr);
for (let y = 0; y < gridSize; y++) {
let currYArr = [];
currXArr.push(currYArr);
for (let z = 0; z < gridSize; z++) {
currYArr.push(new Float32Array([x,y,z]));
}
}
}
Build the following kernel:
const pipelineFuncSettings = {
output: [gridSize, gridSize, gridSize],
pipeline: true,
returnType: 'Array(3)',
};
const copyFramebufferFuncImmutable = gpu.createKernel(function(framebufTex) {
const voxelColour = framebufTex[this.thread.x][this.thread.y][this.thread.z];
return [voxelColour[0], voxelColour[1], voxelColour[2]];
}, {...pipelineFuncSettings, immutable: true, argumentTypes: {framebufTex: 'Array3D(3)'}});
Draw the CPU buffer into a GPU texture and retrieve it as an array:
const bufferTex = copyFramebufferFuncImmutable(buffer);
const texArray = bufferTex.toArray();
Then look to see if what we did was properly copied from the CPU -> GPU -> CPU:
function debugPrint(arr) {
for (let x = 0; x < gridSize; x++) {
for (let y = 0; y < gridSize; y++) {
const temp = [];
for (let z = 0; z < gridSize; z++) {
const currColour = arr[x][y][z];
temp.push("("+currColour[0].toFixed(0)+","+currColour[1].toFixed(0)+","+currColour[2].toFixed(0)+")")
}
strArr.push(temp.join(", "));
}
}
console.log(strArr.join("\n"));
}
... and get this comparative abomination:
CPU (Original/Control) i.e., debugPrint(buffer);:
(0,0,0), (0,0,1), (0,0,2), (0,0,3), (0,0,4), (0,0,5), (0,0,6), (0,0,7)
(0,1,0), (0,1,1), (0,1,2), (0,1,3), (0,1,4), (0,1,5), (0,1,6), (0,1,7)
(0,2,0), (0,2,1), (0,2,2), (0,2,3), (0,2,4), (0,2,5), (0,2,6), (0,2,7)
(0,3,0), (0,3,1), (0,3,2), (0,3,3), (0,3,4), (0,3,5), (0,3,6), (0,3,7)
(0,4,0), (0,4,1), (0,4,2), (0,4,3), (0,4,4), (0,4,5), (0,4,6), (0,4,7)
(0,5,0), (0,5,1), (0,5,2), (0,5,3), (0,5,4), (0,5,5), (0,5,6), (0,5,7)
(0,6,0), (0,6,1), (0,6,2), (0,6,3), (0,6,4), (0,6,5), (0,6,6), (0,6,7)
(0,7,0), (0,7,1), (0,7,2), (0,7,3), (0,7,4), (0,7,5), (0,7,6), (0,7,7)
(1,0,0), (1,0,1), (1,0,2), (1,0,3), (1,0,4), (1,0,5), (1,0,6), (1,0,7)
(1,1,0), (1,1,1), (1,1,2), (1,1,3), (1,1,4), (1,1,5), (1,1,6), (1,1,7)
(1,2,0), (1,2,1), (1,2,2), (1,2,3), (1,2,4), (1,2,5), (1,2,6), (1,2,7)
(1,3,0), (1,3,1), (1,3,2), (1,3,3), (1,3,4), (1,3,5), (1,3,6), (1,3,7)
(1,4,0), (1,4,1), (1,4,2), (1,4,3), (1,4,4), (1,4,5), (1,4,6), (1,4,7)
(1,5,0), (1,5,1), (1,5,2), (1,5,3), (1,5,4), (1,5,5), (1,5,6), (1,5,7)
(1,6,0), (1,6,1), (1,6,2), (1,6,3), (1,6,4), (1,6,5), (1,6,6), (1,6,7)
(1,7,0), (1,7,1), (1,7,2), (1,7,3), (1,7,4), (1,7,5), (1,7,6), (1,7,7)
(2,0,0), (2,0,1), (2,0,2), (2,0,3), (2,0,4), (2,0,5), (2,0,6), (2,0,7)
(2,1,0), (2,1,1), (2,1,2), (2,1,3), (2,1,4), (2,1,5), (2,1,6), (2,1,7)
(2,2,0), (2,2,1), (2,2,2), (2,2,3), (2,2,4), (2,2,5), (2,2,6), (2,2,7)
(2,3,0), (2,3,1), (2,3,2), (2,3,3), (2,3,4), (2,3,5), (2,3,6), (2,3,7)
(2,4,0), (2,4,1), (2,4,2), (2,4,3), (2,4,4), (2,4,5), (2,4,6), (2,4,7)
(2,5,0), (2,5,1), (2,5,2), (2,5,3), (2,5,4), (2,5,5), (2,5,6), (2,5,7)
(2,6,0), (2,6,1), (2,6,2), (2,6,3), (2,6,4), (2,6,5), (2,6,6), (2,6,7)
(2,7,0), (2,7,1), (2,7,2), (2,7,3), (2,7,4), (2,7,5), (2,7,6), (2,7,7)
(3,0,0), (3,0,1), (3,0,2), (3,0,3), (3,0,4), (3,0,5), (3,0,6), (3,0,7)
(3,1,0), (3,1,1), (3,1,2), (3,1,3), (3,1,4), (3,1,5), (3,1,6), (3,1,7)
(3,2,0), (3,2,1), (3,2,2), (3,2,3), (3,2,4), (3,2,5), (3,2,6), (3,2,7)
(3,3,0), (3,3,1), (3,3,2), (3,3,3), (3,3,4), (3,3,5), (3,3,6), (3,3,7)
(3,4,0), (3,4,1), (3,4,2), (3,4,3), (3,4,4), (3,4,5), (3,4,6), (3,4,7)
(3,5,0), (3,5,1), (3,5,2), (3,5,3), (3,5,4), (3,5,5), (3,5,6), (3,5,7)
(3,6,0), (3,6,1), (3,6,2), (3,6,3), (3,6,4), (3,6,5), (3,6,6), (3,6,7)
(3,7,0), (3,7,1), (3,7,2), (3,7,3), (3,7,4), (3,7,5), (3,7,6), (3,7,7)
(4,0,0), (4,0,1), (4,0,2), (4,0,3), (4,0,4), (4,0,5), (4,0,6), (4,0,7)
(4,1,0), (4,1,1), (4,1,2), (4,1,3), (4,1,4), (4,1,5), (4,1,6), (4,1,7)
(4,2,0), (4,2,1), (4,2,2), (4,2,3), (4,2,4), (4,2,5), (4,2,6), (4,2,7)
(4,3,0), (4,3,1), (4,3,2), (4,3,3), (4,3,4), (4,3,5), (4,3,6), (4,3,7)
(4,4,0), (4,4,1), (4,4,2), (4,4,3), (4,4,4), (4,4,5), (4,4,6), (4,4,7)
(4,5,0), (4,5,1), (4,5,2), (4,5,3), (4,5,4), (4,5,5), (4,5,6), (4,5,7)
(4,6,0), (4,6,1), (4,6,2), (4,6,3), (4,6,4), (4,6,5), (4,6,6), (4,6,7)
(4,7,0), (4,7,1), (4,7,2), (4,7,3), (4,7,4), (4,7,5), (4,7,6), (4,7,7)
(5,0,0), (5,0,1), (5,0,2), (5,0,3), (5,0,4), (5,0,5), (5,0,6), (5,0,7)
(5,1,0), (5,1,1), (5,1,2), (5,1,3), (5,1,4), (5,1,5), (5,1,6), (5,1,7)
(5,2,0), (5,2,1), (5,2,2), (5,2,3), (5,2,4), (5,2,5), (5,2,6), (5,2,7)
(5,3,0), (5,3,1), (5,3,2), (5,3,3), (5,3,4), (5,3,5), (5,3,6), (5,3,7)
(5,4,0), (5,4,1), (5,4,2), (5,4,3), (5,4,4), (5,4,5), (5,4,6), (5,4,7)
(5,5,0), (5,5,1), (5,5,2), (5,5,3), (5,5,4), (5,5,5), (5,5,6), (5,5,7)
(5,6,0), (5,6,1), (5,6,2), (5,6,3), (5,6,4), (5,6,5), (5,6,6), (5,6,7)
(5,7,0), (5,7,1), (5,7,2), (5,7,3), (5,7,4), (5,7,5), (5,7,6), (5,7,7)
(6,0,0), (6,0,1), (6,0,2), (6,0,3), (6,0,4), (6,0,5), (6,0,6), (6,0,7)
(6,1,0), (6,1,1), (6,1,2), (6,1,3), (6,1,4), (6,1,5), (6,1,6), (6,1,7)
(6,2,0), (6,2,1), (6,2,2), (6,2,3), (6,2,4), (6,2,5), (6,2,6), (6,2,7)
(6,3,0), (6,3,1), (6,3,2), (6,3,3), (6,3,4), (6,3,5), (6,3,6), (6,3,7)
(6,4,0), (6,4,1), (6,4,2), (6,4,3), (6,4,4), (6,4,5), (6,4,6), (6,4,7)
(6,5,0), (6,5,1), (6,5,2), (6,5,3), (6,5,4), (6,5,5), (6,5,6), (6,5,7)
(6,6,0), (6,6,1), (6,6,2), (6,6,3), (6,6,4), (6,6,5), (6,6,6), (6,6,7)
(6,7,0), (6,7,1), (6,7,2), (6,7,3), (6,7,4), (6,7,5), (6,7,6), (6,7,7)
(7,0,0), (7,0,1), (7,0,2), (7,0,3), (7,0,4), (7,0,5), (7,0,6), (7,0,7)
(7,1,0), (7,1,1), (7,1,2), (7,1,3), (7,1,4), (7,1,5), (7,1,6), (7,1,7)
(7,2,0), (7,2,1), (7,2,2), (7,2,3), (7,2,4), (7,2,5), (7,2,6), (7,2,7)
(7,3,0), (7,3,1), (7,3,2), (7,3,3), (7,3,4), (7,3,5), (7,3,6), (7,3,7)
(7,4,0), (7,4,1), (7,4,2), (7,4,3), (7,4,4), (7,4,5), (7,4,6), (7,4,7)
(7,5,0), (7,5,1), (7,5,2), (7,5,3), (7,5,4), (7,5,5), (7,5,6), (7,5,7)
(7,6,0), (7,6,1), (7,6,2), (7,6,3), (7,6,4), (7,6,5), (7,6,6), (7,6,7)
(7,7,0), (7,7,1), (7,7,2), (7,7,3), (7,7,4), (7,7,5), (7,7,6), (7,7,7)
GPU toArray() result i.e., debugPrint(texBuffer);:
(0,0,0), (1,0,0), (2,0,0), (3,0,0), (4,0,0), (5,0,0), (6,0,0), (7,0,0)
(0,1,0), (1,1,0), (2,1,0), (3,1,0), (4,1,0), (5,1,0), (6,1,0), (7,1,0)
(0,2,0), (1,2,0), (2,2,0), (3,2,0), (4,2,0), (5,2,0), (6,2,0), (7,2,0)
(0,3,0), (1,3,0), (2,3,0), (3,3,0), (4,3,0), (5,3,0), (6,3,0), (7,3,0)
(0,4,0), (1,4,0), (2,4,0), (3,4,0), (4,4,0), (5,4,0), (6,4,0), (7,4,0)
(0,5,0), (1,5,0), (2,5,0), (3,5,0), (4,5,0), (5,5,0), (6,5,0), (7,5,0)
(0,6,0), (1,6,0), (2,6,0), (3,6,0), (4,6,0), (5,6,0), (6,6,0), (7,6,0)
(0,7,0), (1,7,0), (2,7,0), (3,7,0), (4,7,0), (5,7,0), (6,7,0), (7,7,0)
(0,0,0), (1,0,4), (2,4,5), (3,2,4), (4,3,4), (5,4,4), (6,5,4), (7,6,4)
(0,0,1), (1,5,5), (2,1,5), (3,2,5), (4,3,5), (5,4,5), (6,5,5), (7,6,5)
(0,2,1), (1,0,6), (2,1,6), (3,2,6), (4,3,6), (5,4,6), (6,5,6), (7,6,5)
(0,0,3), (1,0,7), (2,1,7), (3,2,7), (4,3,7), (5,4,7), (6,7,5), (7,6,7)
(0,0,0), (1,1,0), (2,2,0), (3,3,0), (4,4,0), (5,0,5), (6,6,0), (7,7,0)
(0,0,1), (1,1,1), (2,2,1), (3,3,1), (4,1,5), (5,5,1), (6,6,1), (7,7,1)
(0,0,2), (1,1,2), (2,2,2), (3,2,5), (4,4,2), (5,5,2), (6,6,2), (7,7,2)
(0,0,3), (1,1,3), (2,3,5), (3,3,3), (4,4,3), (5,5,3), (6,6,3), (7,7,3)
(0,0,0), (1,0,4), (2,0,4), (3,0,4), (4,0,4), (5,0,4), (6,0,4), (7,0,4)
(0,1,1), (1,1,5), (2,1,5), (3,1,5), (4,1,5), (5,1,5), (6,1,5), (7,1,5)
(0,2,2), (1,2,6), (2,2,6), (3,2,6), (4,2,6), (5,2,6), (6,2,6), (7,2,6)
(0,3,3), (1,3,7), (2,3,7), (3,3,7), (4,3,7), (5,3,7), (6,3,7), (7,3,7)
(0,4,0), (1,4,0), (2,4,0), (3,4,0), (4,4,0), (5,4,0), (6,4,0), (7,4,0)
(0,5,1), (1,5,1), (2,5,1), (3,5,1), (4,5,1), (5,5,1), (6,5,1), (7,5,1)
(0,6,2), (1,6,2), (2,6,2), (3,6,2), (4,6,2), (5,6,2), (6,6,2), (7,6,2)
(0,7,3), (1,7,3), (2,7,3), (3,7,3), (4,7,3), (5,7,3), (6,7,3), (7,7,3)
(0,0,3), (1,0,3), (2,0,3), (3,0,3), (4,0,3), (5,0,3), (6,0,3), (7,0,3)
(0,1,3), (1,1,3), (2,1,3), (3,1,3), (4,1,3), (5,1,3), (6,1,3), (7,1,3)
(0,2,3), (1,2,3), (2,2,3), (3,2,3), (4,2,3), (5,2,3), (6,2,3), (7,2,3)
(0,3,3), (1,3,3), (2,3,3), (3,3,3), (4,3,3), (5,3,3), (6,3,3), (7,3,3)
(0,4,3), (1,4,3), (2,4,3), (3,4,3), (4,4,3), (5,4,3), (6,4,3), (7,4,3)
(0,5,3), (1,5,3), (2,5,3), (3,5,3), (4,5,3), (5,5,3), (6,5,3), (7,5,3)
(0,6,3), (1,6,3), (2,6,3), (3,6,3), (4,6,3), (5,6,3), (6,6,3), (7,6,3)
(0,7,3), (1,7,3), (2,7,3), (3,7,3), (4,7,3), (5,7,3), (6,7,3), (7,7,3)
(0,0,4), (1,0,4), (2,0,4), (3,0,4), (4,0,4), (5,0,4), (6,0,4), (7,0,4)
(0,1,4), (1,1,4), (2,1,4), (3,1,4), (4,1,4), (5,1,4), (6,1,4), (7,1,4)
(0,2,4), (1,2,4), (2,2,4), (3,2,4), (4,2,4), (5,2,4), (6,2,4), (7,2,4)
(0,3,4), (1,3,4), (2,3,4), (3,3,4), (4,3,4), (5,3,4), (6,3,4), (7,3,4)
(0,4,4), (1,4,4), (2,4,4), (3,4,4), (4,4,4), (5,4,4), (6,4,4), (7,4,4)
(0,5,4), (1,5,4), (2,5,4), (3,5,4), (4,5,4), (5,5,4), (6,5,4), (7,5,4)
(0,6,4), (1,6,4), (2,6,4), (3,6,4), (4,6,4), (5,6,4), (6,6,4), (7,6,4)
(0,7,4), (1,7,4), (2,7,4), (3,7,4), (4,7,4), (5,7,4), (6,7,4), (7,7,4)
(0,0,0), (1,0,5), (2,1,5), (3,2,5), (4,3,5), (5,5,1), (6,5,5), (7,6,5)
(0,0,1), (1,0,6), (2,1,6), (3,2,6), (4,6,1), (5,4,6), (6,5,6), (7,6,6)
(0,0,2), (1,0,7), (2,1,7), (3,7,1), (4,3,7), (5,4,7), (6,5,7), (7,6,7)
(0,0,0), (1,1,0), (2,0,1), (3,3,0), (4,4,0), (5,5,0), (6,6,0), (7,7,0)
(0,0,1), (1,1,1), (2,2,1), (3,3,1), (4,4,1), (5,5,1), (6,6,1), (7,7,1)
(0,2,1), (1,1,2), (2,2,2), (3,3,2), (4,4,2), (5,5,2), (6,6,2), (7,2,1)
(0,0,3), (1,1,3), (2,2,3), (3,3,3), (4,4,3), (5,5,3), (6,3,1), (7,7,3)
(0,0,4), (1,1,4), (2,2,4), (3,3,4), (4,4,4), (5,4,1), (6,6,4), (7,7,4)
(0,0,0), (1,0,5), (2,0,5), (3,0,5), (4,0,5), (5,0,5), (6,0,5), (7,0,5)
(0,1,1), (1,1,6), (2,1,6), (3,1,6), (4,1,6), (5,1,6), (6,1,6), (7,1,6)
(0,2,2), (1,2,7), (2,2,7), (3,2,7), (4,2,7), (5,2,7), (6,2,7), (7,2,7)
(0,3,0), (1,3,0), (2,3,0), (3,3,0), (4,3,0), (5,3,0), (6,3,0), (7,3,0)
(0,4,1), (1,4,1), (2,4,1), (3,4,1), (4,4,1), (5,4,1), (6,4,1), (7,4,1)
(0,5,2), (1,5,2), (2,5,2), (3,5,2), (4,5,2), (5,5,2), (6,5,2), (7,5,2)
(0,6,3), (1,6,3), (2,6,3), (3,6,3), (4,6,3), (5,6,3), (6,6,3), (7,6,3)
(0,7,4), (1,7,4), (2,7,4), (3,7,4), (4,7,4), (5,7,4), (6,7,4), (7,7,4)
(0,0,7), (1,0,7), (2,0,7), (3,0,7), (4,0,7), (5,0,7), (6,0,7), (7,0,7)
(0,1,7), (1,1,7), (2,1,7), (3,1,7), (4,1,7), (5,1,7), (6,1,7), (7,1,7)
(0,2,7), (1,2,7), (2,2,7), (3,2,7), (4,2,7), (5,2,7), (6,2,7), (7,2,7)
(0,3,7), (1,3,7), (2,3,7), (3,3,7), (4,3,7), (5,3,7), (6,3,7), (7,3,7)
(0,4,7), (1,4,7), (2,4,7), (3,4,7), (4,4,7), (5,4,7), (6,4,7), (7,4,7)
(0,5,7), (1,5,7), (2,5,7), (3,5,7), (4,5,7), (5,5,7), (6,5,7), (7,5,7)
(0,6,7), (1,6,7), (2,6,7), (3,6,7), (4,6,7), (5,6,7), (6,6,7), (7,6,7)
(0,7,7), (1,7,7), (2,7,7), (3,7,7), (4,7,7), (5,7,7), (6,7,7), (7,7,7)
How important is this (1-5)?
Strikes me as a pretty integral issue since there appears to be a non-identical transformation between CPU and GPU buffers.
Expected behavior (i.e. solution)
Those two arrays should be the same (or at least differ by an obvious matrix transform/mapping), instead the toArray() buffer is filled with duplicate data and errors that don't map at all to the original CPU buffer.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con il percorso degli argomenti createKernel(...), Array3D(3) e bufferTex.toArray() usando la riproduzione 8×8×8 fornita su Node.js/headlessgl. Confronta il buffer della CPU con l'array della texture restituito e traccia la lettura della texture dalla GPU e la mappatura degli indici; il lavoro è completo quando toArray() conserva i valori di input o applica una mappatura coerente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- javascript, node.js
- Ambito
- computer-graphics
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100