Orillusion / orillusion

Orillusion is a pure Web3D rendering engine which is fully developed based on the WebGPU standard.
https://www.orillusion.com
MIT License
5.01k stars 622 forks source link

[FR]: 关于webgpu模拟双精度问题 #141

Open GGBond-GIS opened 1 year ago

GGBond-GIS commented 1 year ago

WebGIS大地坐标系统

在常规的gis引擎中需要双精度来准确的描述地理信息,在webgpu中没有双精度; 在低级别中对精度要求不高的情况: image 在高级别中对精度要求较高的情况: image

lslzl3000 commented 1 year ago

这个可以去 webgpu 的 repo 反馈,按照目前 webgpu 的社区反馈可能暂时不会规划支持,主要是一些设备和平台不支持64位双精度浮点数,作为一个统一的web的标准,webgpu 官方尽量想规避因为设备和系统带来的差异,但未来是有可能以extension的形式支持 我们目前也在观望,暂时不打算对这部分做支持,通过算法模拟双精度性能不会太好,而且额外的gpu消耗也非常大 比起在webgpu层面支持双精度,通过应用层面去处理精度问题更灵活一些。一些常用的处理方案可以有效规避数据抖动和精度问题,比如:

  1. 由 js 统一处理成float32再传入wgsl 可以有效消除数据抖动的问题;
  2. 手动将float64转换成2个float32来存储
  3. 对于gis类应用,可以引入相对偏差数值/offset 数据作为参考系,一个f32数据足以表达精度

这个 issues 可以保持 open,看看 webgpu 未来支持情况如何

JingwenBai commented 1 year ago

这个问题很多人都有反馈过,而且也应该是有一些解决方案的。目前来看最好的办法是webgpu官方来支持这种特性。不过针对于我们的场景,应该是可以有一些特定的解决方法的。

咱们是否可以更详细的描述一下具体使用场景和需求,哪些功能必须要双精度来支持,如果没有双精度会出现什么样的问题。我们可以针对具体的问题,再做进一步分析和讨论~

目前单纯从issue中的截图效果来看,世界地图的精度下,可以正常显示地图信息。但是到了街道地图的精度下,所有的道路和建筑边缘会因为精度不够的问题,造成了边缘“弯曲”的效果。不知道是否这样理解呢?

lslzl3000 commented 1 year ago

这个问题很多人都有反馈过,而且也应该是有一些解决方案的。目前来看最好的办法是webgpu官方来支持这种特性。不过针对于我们的场景,应该是可以有一些特定的解决方法的。

咱们是否可以更详细的描述一下具体使用场景和需求,哪些功能必须要双精度来支持,如果没有双精度会出现什么样的问题。我们可以针对具体的问题,再做进一步分析和讨论~

目前单纯从issue中的截图效果来看,世界地图的精度下,可以正常显示地图信息。但是到了街道地图的精度下,所有的道路和建筑边缘会因为精度不够的问题,造成了边缘“弯曲”的效果。不知道是否这样理解呢?

gis中渲染的都是一个一个瓦片/格子,由于js里是f64双精度数据,直接传入gpu计算会造成精度丢失,造成每个瓦片/格子位置发生轻微错位,大地图上精度不高,丢失了也基本看不出来,但缩放级别高了,一点点精度就比较明显了,会出现渲染抖动和错位

所谓模拟f64,可以牺牲显存,将f64转换成2个f32来存储传入gpu,除此之外还需要配合额外wgsl算法去实现用2个高低位f32计算f64的过程,性能和显存消耗都比较大

比起这种模拟形式,我上面回复也提到了,这个问题可以通过js层面统一先处理成f32后再传入gpu,可以有效避免抖动和错位问题

如果要求精度不丢失,可以通过在js应用层面先将gis坐标处理成一种相对差值坐标系,就是每个瓦片只传递相对位置差值,这样一个f32的精度也足够表达原始f64的位置信息

JingwenBai commented 1 year ago

内部讨论的结果是,引擎层次可以针对于类似于GIS的场景或者其他对于数字精度要求比较高,以及大数场景做一些特殊的能力支持。

我们需要更多的时间来评估,用什么方案来处理更加合理,也总结出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现提高精度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理
GGBond-GIS commented 1 year ago

内部讨论的结果是,引擎层次可以针对类于GIS的场景或者其他者针对数字精度要求比更高,以及大数据场景做一些特殊的能力支持。

我们需要更多的时间来评价,用什么方法来处理更合理,也总得出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现现代提高度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理

是否可以提供一个demo类似这种 https://prideout.net/emulating-double-precision image

lslzl3000 commented 1 year ago

内部讨论的结果是,引擎层次可以针对类于GIS的场景或者其他者针对数字精度要求比更高,以及大数据场景做一些特殊的能力支持。 我们需要更多的时间来评价,用什么方法来处理更合理,也总得出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现现代提高度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理

是否可以提供一个demo类似这种 https://prideout.net/emulating-double-precision image

ok,这个例子就是在 shader 里做 f64 的拼接处理,把一个 f64 处理成两个高低位 f32 来做拼接运算,您是希望能用 wgsl 来做一个类似处理是吗?

GGBond-GIS commented 1 year ago

内部讨论的结果是,引擎层次可以针对类于GIS的场景或者其他者针对数字精度要求比更高,以及大数据场景做一些特殊的能力支持。 我们需要更多的时间来评价,用什么方法来处理更合理,也总得出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现现代提高度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理

是否可以提供一个demo类似这种 https://prideout.net/emulating-double-precision image

ok,这个例子就是在 shader 里做 f64 的拼接处理,把一个 f64 处理成两个高低位 f32 来做拼接运算,您是希望能用 wgsl 来做一个类似处理是吗?

是的我希望有一个orillusion做的demo