相关疑难解决方法(0)

THREE.js 从 GPUComputationRenderer 纹理读取像素

我一直在玩 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)

javascript shader webgl three.js

3
推荐指数
1
解决办法
3883
查看次数

是否可以进行 RGBA 浮动和返回往返并读取 WebGL GLSL ES 1.0 中的像素?

我在尝试了每种可能的算法大约一周后提出了这个问题,并且使用了 stackoverflow 上可能的每个先前答案 - 但没有结果。所以,请善意地帮助 GLSL 学徒。

我在尝试着

  1. 将 RGBA 转换为浮点型
  2. 执行一些计算
  3. 将浮点数转换为 RGBA

在 GPU 内部 - 初始 RGBA 是通过 Float32 到 Uint8 转换在 javascript 中定义的。

关键是能够在 GPU 中进行计算(GIS 距离等)后进行往返并读回浮点数,而 RGB 的分辨率太低。

我想通过 .read 将结果读回 javascript gl.readPixels

我开始怀疑这是否可能的原因是:

  1. 如果我不进行 RGBA => float => RGBA 转换,一切正常 - 我放入 GPU 的浮点数也是我取出的浮点数 - 没有损失
  2. 如果我进行 RGB => float => RGB 转换,它也可以正常工作,所有的问题都在于第四个分量作为最不重要或最重要的部分

请注意 - 我怀疑这适用于更高版本的 GLSL,但这是 WebGL GLSL ES 1.0,具有更多的限制和更少的功能,并且我怀疑写入纹理将成为 iOS 上的限制 - 这是我需要的。

我考虑过列出我在这里尝试过的所有代码 - 如果有必要可以这样做,但这似乎有点矫枉过正。

很快就知道这不可能的,现在就足够了——至少我不会再用头撞墙了。

glsl webgl

1
推荐指数
1
解决办法
1239
查看次数

标签 统计

webgl ×2

glsl ×1

javascript ×1

shader ×1

three.js ×1