THREE.js 从 GPUComputationRenderer 纹理读取像素

问题描述 投票:0回答:2

我一直在使用 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 仍然完全充满零,而不是所需的位置坐标值。


有人可以建议我如何将纹理数据读入像素缓冲区吗? (最好在 THREE.js/plain javascript 中,因为我对 WebGL 一无所知)。

javascript three.js webgl shader
2个回答
5
投票

最新答案

参见

WebGL 从浮点渲染目标读取像素

答案已过时

简短的回答是

这并不容易。在 WebGL 1.0 中,没有简单的方法可以从浮点纹理读取像素,而这正是 GPUComputationRenderer

 使用的方法。

如果您确实想读回数据,则需要将 GPUComputationRenderer 浮点纹理渲染为 8 位 RGBA 纹理,并执行从 32 位浮点到 8 位纹理的某种编码。然后您可以在 JavaScript 中读回并查看值。


2
投票
抱歉让您久等了。我已经很久没有登录SO了。

以水和网球为例,

https://trijs.org/examples/?q=water#webgl_gpgpu_water

从 GPU 读回球位置处的水高度。

使用整数 4 分量纹理来给出 1 分量浮点纹理。

纹理有4x1像素,其中第一个是高度,另外2个是水面的法线(最后一个像素不使用)

针对每个网球计算并读回该纹理,并在 CPU 中执行球物理。

© www.soinside.com 2019 - 2024. All rights reserved.