【发布时间】:2018-06-29 20:55:31
【问题描述】:
我想在 web Worker 中处理 THREE.Texture 以帮助后期处理效果,例如绽放。例如,对于绽放效果,我会首先在 THREE.Texture 对象上绘制场景,然后我想在 web worker 中处理模糊过程。将 THREE.Texture 数据传递给工作人员并根据从工作人员获得的数据创建新的 THREE.Texture 的最有效方法是什么。由于理想情况下我会每秒执行 60 次,因此我需要一种快速且内存友好的方式来执行此操作(内存友好:不是在循环中创建新对象,而是重用现有对象)。
我知道 canvas2DContext.getImageData 可能会有所帮助,但这可能不是最好的方法,因为我每秒会在画布上绘制 60 次,这会减慢速度。
谢谢!
PS:我应该指定在这种方法中,我不打算等待工人完成处理纹理来渲染最终结果。由于大多数对象都是静态的,我认为这没什么大不了的。不过,我想测试一下它对动态对象的影响。
【问题讨论】:
-
您为什么不坚持使用three.js 示例并使用例如
UnrealBloomPass?它使用 GPU 进行非常高效的处理。我不认为,当你使用 webworkers 时,你会在性能方面得到任何接近的东西。你的方法对我来说听起来很奇怪。 threejs.org/examples/#webgl_postprocessing_unreal_bloom -
我知道,但我想进行实验。我的想法是处理工作人员内部的模糊,并减少一次 WebGL 渲染调用(模糊通道)。
-
您可以使用
canvas.getImageData()检索代表原始图像数据的Uint8ClampedArray。然后,您可以通过Transferable Objects 将相应的ArrayBuffer发送给工作人员。如果您要使用多个工作人员,则必须将原始Uint8ClampedArray拆分为多个数组缓冲区,因为可转移对象仅在单个执行上下文中有效。无论如何,你的表现会比使用 GPU 更差。所以我不确定在这方面投入时间是否有意义。 -
好吧,我知道 getImageData 真的很慢,所以在我的问题中,如果可能的话,我要求使用 getImageData 以外的方法。
-
在下面的例子中使用
WebGLRenderingContext.readPixels()也应该可以工作:stackoverflow.com/questions/13626606/…