我一直在使用 GPUComputationRenderer 来修改这个 3.js 示例的版本,它使用 GPU 着色器来修改交互物体的速度,以保存、读取和操作物体位置和速度数据。
我已经到了可以使用着色器将 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 * 4);
//var gl = renderer.getContext();
//gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, pixelBuffer);
var pixelBuffer = new Uint8Array( WIDTH * WIDTH * 4); //... OK.
//var gl = gpuCompute.getContext();//... no getContext function!!!
//... from Nick Whaley here: http://stackoverflow.com/questions/13475209/three-js-get-data-from-three-webglrendertarget
//WebGLRenderer.readRenderTargetPixels ( renderTarget, x, y, width, height, buffer )
gpuCompute.readRenderTargetPixels ( xTexture, 0, 0, WIDTH, WIDTH, pixelBuffer ); //... readRenderTargetPixels is not a function!
如代码所示,我“想要”
gpuCompute
渲染器对象提供诸如
.getContext()
或
readRenderTargetPixels()
之类的功能,但它们对于
gpuCompute
不存在。
然后我尝试添加以下代码:-
//... the WebGLRenderer code is included in THREE.js build
myWebglRenderer = new THREE.WebGLRenderer();
var myRenderTarget = gpuCompute.getCurrentRenderTarget( positionVariable );
myWebglRenderer.readRenderTargetPixels (
myRenderTarget, 0, 0, WIDTH, WIDTH, pixelBuffer );
执行正常,但 PixelBuffer 仍然完全充满零,而不是所需的位置坐标值。