我一直在玩 GPUComputationRenderer 在这个 Three.js 示例的修改版本上,该示例使用 GPU 着色器来修改交互 boid 的速度,以保存、读取和操作 boid 位置和速度数据。
我已经到了可以使用着色器将 GPU 计算数据(预测碰撞时间)放入纹理缓冲区的阶段。但是现在我想在主要的 javascript 动画脚本中读取一些纹理数据(以找到最早的碰撞)。
这是渲染函数中的相关代码(在每个动画传递中调用)
//... GPU calculations as per original THREE.js example
gpuCompute.compute(); //... gpuCompute is the gpu computation renderer.
birdUniforms.texturePosition.value = gpuCompute.getCurrentRenderTarget( positionVariable ).texture;
birdUniforms.textureVelocity.value = gpuCompute.getCurrentRenderTarget( velocityVariable ).texture;
var xTexture = birdUniforms.texturePosition.value;//... my variable, OK.
//... From http://zhangwenli.com/blog/2015/06/20/read-from-shader-texture-with-threejs/
//... but note that this reads from the main THREE.js renderer NOT from the gpuCompute renderer.
//var pixelBuffer = new Uint8Array(canvas.width * canvas.height …Run Code Online (Sandbox Code Playgroud) 我在尝试了每种可能的算法大约一周后提出了这个问题,并且使用了 stackoverflow 上可能的每个先前答案 - 但没有结果。所以,请善意地帮助 GLSL 学徒。
我在尝试着
在 GPU 内部 - 初始 RGBA 是通过 Float32 到 Uint8 转换在 javascript 中定义的。
关键是能够在 GPU 中进行计算(GIS 距离等)后进行往返并读回浮点数,而 RGB 的分辨率太低。
我想通过 .read 将结果读回 javascript gl.readPixels。
我开始怀疑这是否可能的原因是:
请注意 - 我怀疑这适用于更高版本的 GLSL,但这是 WebGL GLSL ES 1.0,具有更多的限制和更少的功能,并且我怀疑写入纹理将成为 iOS 上的限制 - 这是我需要的。
我考虑过列出我在这里尝试过的所有代码 - 如果有必要可以这样做,但这似乎有点矫枉过正。
很快就知道这是不可能的,现在就足够了——至少我不会再用头撞墙了。