【问题标题】:Three.js Retrieve data from WebGLRenderTarget (water sim)Three.js 从 WebGLRenderTarget (water sim) 中检索数据
【发布时间】:2013-08-12 15:09:33
【问题描述】:

我正在尝试将此 (http://madebyevan.com/webgl-water/‎) 移植到三个。我想我已经接近了(现在只想要模拟,不关心焦散/折射)。我想让它与着色器一起使用以提高 GPU 性能。

这是我目前使用着色器的三个设置:http://jsfiddle.net/EqLL9/2/ (第二个较小的平面用于调试当前 WebGLRenderTarget 中的内容)

我正在努力从 WebGLRenderTarget(在我的示例中为 rtTexture)读回数据。在示例中,您将看到围绕中心点的 4 个顶点向上移动。这是正确的(在 1 个模拟步骤之后),因为它以中心点作为唯一的位移点开始。

如果我可以从 rtTexture 读回数据并在每帧更新数据纹理 (buf1),那么模拟应该会正确设置动画。如何直接从 WebGLRenderTarget 读取数据?所有示例都演示了如何将数据发送到目标(渲染到目标),而不是从中读取。还是我做错了?有些东西告诉我,我必须使用多种纹理,并以某种方式来回交换,类似于 Evan 的做法。

TL;DR:在这样的调用之后,如何将数据从 WebGLRenderTarget 复制到 DataTexture:
// render to rtTexture
renderer.render( sceneRTT, cameraRTT, rtTexture, true );

编辑:可能在 jsfiddle /gero3/UyGD8/9/ 找到了解决方案 将进行调查并报告。

【问题讨论】:

    标签: three.js webgl shader simulation


    【解决方案1】:

    好的,我想出了如何使用本机 webgl 调用来读取数据:

    // Render first scene into texture
    renderer.render( sceneRTT, cameraRTT, rtTexture, true );
    
    // read render texture into buffer
    var gl = renderer.getContext();
    gl.readPixels( 0, 0, simRes, simRes, gl.RGBA, gl.UNSIGNED_BYTE, buf1.image.data );
    buf1.needsUpdate = true;
    


    模拟现在动画。但是,它似乎无法正常运行(可能是我忽略的愚蠢错误)。似乎高度值从未受到抑制,我不知道为什么。来自 buf1 的数据用于片段着色器,它计算新高度(RGBA 中的红色),阻尼值(乘以 0.99),然后将其渲染为纹理。然后我将这些更新后的数据从纹理读回 buf1。

    这是最新的小提琴:http://jsfiddle.net/EqLL9/3/

    随着我的进展,我会保持更新。

    编辑:现在效果很好。刚刚实现了法线,现在正在研究环境反射和折射(同样纯粹是通过着色器)。 http://relicweb.com/webgl/rt.html

    【讨论】:

    • 好的,修复了模拟。我没有使用双 WebGLRenderTargets 实现双缓冲。最新的是:jsfiddle.net/EqLL9/4
    • 优秀。下面是另一个在three.js框架内实现GPGPU的例子:jabtunes.com/labs/3d/gpuflocking/webgl_gpgpu_flocking3.html
    • @WestLangley 谢谢你,看起来很酷。我已经更新了我的模拟并将其放在我的主站点上(这仍然是一个严重的 WIP):http://relicweb.com/webgl/rt.html
    • 这可能会有所帮助:threejs.org/examples/webgl_postprocessing_godrays.html 接受不完全令人满意的答案将导致问题的观看次数减少,因为每个人都会认为这一切都很好。
    • 我正在研究我的水的类似模拟。就像你的情况一样,阻尼不起作用。双缓冲是如何解决阻尼问题的?
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2019-11-19
    相关资源
    最近更新 更多