WebGL Reading pixels properly from offscreen canvas
You should always look in the JavaScript console of your browser (press F12) or pick it from the menus. I should have shown an error for your code
var capturedImageData = new Float32Array(screenWidth * screenHeight * 4);
gl.readPixels(0, 0, screenWidth, screenHeight, gl.RGBA, gl.FLOAT, capturedImageData);
const gl = document.createElement('canvas').getContext('webgl');
const screenWidth = 300;
const screenHeight = 150;
var capturedImageData = new Float32Array(screenWidth * screenHeight * 4);
gl.readPixels(0, 0, screenWidth, screenHeight, gl.RGBA, gl.FLOAT, capturedImageData);
When I run your code I get this error
js:16 WebGL: INVALID_ENUM: readPixels: invalid type
You can't read with FLOAT
. See this answer
But, what you're trying to do, render to one texture and use that as input to another shader should not be done with readPixels. It should be done with framebuffers allowing you to directly render to a texture.
See this or maybe one of these
For some reason gl.readPixels works better with a Uint8Array.
var capturedImageData = new Uint8Array(screenWidth * screenHeight * 4);
gl.readPixels(0, 0, screenWidth, screenHeight, gl.RGBA, gl.UNSIGNED_BYTE, capturedImageData);
Here is a demo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
</head>
<canvas></canvas>
<body>
<script>
var gl = document.querySelector("canvas").getContext("webgl");
gl.clearColor(1, 0, 1, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
var pixels = new Uint8Array(4 * window.innerWidth * window.innerHeight);
gl.readPixels(0, 0, window.innerWidth, window.innerHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
console.log(pixels[0]);
</script>
</body>
</html>