2
我使用的是"threejs-examples-webgl-gpgpu_water",并且希望在物体表面上放置一个物体,这意味着物体与顶点位移同步。three.js水面跟随物体
我无法找到如何获取水面坐标x,y的当前高度。我猜想图像是在着色器中计算的,并且没有访问变形水面的中间值。有人可以帮忙吗?
我使用的是"threejs-examples-webgl-gpgpu_water",并且希望在物体表面上放置一个物体,这意味着物体与顶点位移同步。three.js水面跟随物体
我无法找到如何获取水面坐标x,y的当前高度。我猜想图像是在着色器中计算的,并且没有访问变形水面的中间值。有人可以帮忙吗?
水的高度值存储在作为渲染目标的一部分的纹理中,因此您可以使用renderer.readRenderTargetPixels (renderTarget, x, y, width, height, buffer)
来拉出特定点处的水的高度。
不幸的是,纹理是一个浮点纹理,没有办法直接读取WebGL中的浮点纹理到JavaScript中。
您需要做的是将该浮点纹理渲染为非浮点RGBA 8位纹理/ rendertarget,同时使用与this相关的一些代码将其量化为其他表示。
在伪代码
// at init time
.. make rendertarget with RGBA,UNSIGNED_BYTE texture
// at render time
.. render `gpuCompute.getCurrentRenderTarget(heightmapVariable).texture;`
.. into your render target using a shader that converts the
.. floating point height values in RGBA like the example above
// read out a pixel from your render target
var heightData = new Uint8Array(4);
var x = ... // compute which pixel you need to read
var y = ... // to get the height you want
var width = 1
var height = 1;
renderer.readRenderTargetPixels (renderTarget, x, y, width, height, heightData);
.. convert heightData back into a height value.
的Merci beaucoup。分享这种熟练的专业知识是非常善良的。我会朝这个方向努力。非常感谢。 – user2758635
我设法按照您的建议实施,并且效果良好。然而,我正在用包装浮动/ v4挣扎,因为纹理包括高度漂浮可以是<0 and > 1和webgl包装浮动到v4适用于rgb数据(在0 - 1之间)./因此,我将一些量化到高度得到一个0-1浮球,但我认为应该有可能将浮球打包好......我会在完成后回来。 – user2758635