gpujs / gpujs/gpu.js

Strange output on Array3D(3) toArray()

Aperta
#622 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. 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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.