HarmonyOS鸿蒙Next中3DGS能否与几何体做深度遮挡?

HarmonyOS鸿蒙Next中3DGS能否与几何体做深度遮挡? 问题:

@hms.graphics.spatialRender GSPlugin 渲染的 3DGS 高斯泼溅,能否与 @kit.ArkGraphics3D 几何体做深度遮挡?

需求: 使用 spatialRender.GSPlugin.loadGSNode() 加载 3D Gaussian Splatting (.ply) 模型渲染正常。现需要在场景中叠加一个立方体包围线框盒(12 条 Geometry+CubeGeometry 线段),期望高斯点云与包围盒线段互相做正确的深度遮挡:靠近相机的高斯遮住后方线段,远离相机的线段被前方高斯遮住。

实测结果:

3dgs始终覆盖在包围盒上,没有任何深度交互,无论包围盒材质如何配置。

环境:

SDK:HarmonyOS 6.1.1 Beta1 SDK,原样包含OpenHarmony SDK Ohos_sdk_public 6.1.1.115 (API Version 24 Beta1)

设备:pura 90 pro HarmonyOS 6.1.0.120 SP30

模块:@kit.ArkGraphics3D + @hms.graphics.spatialRender

cke_15869.png


更多关于HarmonyOS鸿蒙Next中3DGS能否与几何体做深度遮挡?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

目前从公开能力来看:

@hms.graphics.spatialRender.GSPlugin

渲染的 3DGS(Gaussian Splatting)与:

@kit.ArkGraphics3D

里的常规 Geometry / Mesh / Line 并不能真正共享深度缓冲(Depth Buffer)。

所以你现在看到的现象:

3DGS 永远覆盖在线框盒上方

其实是当前版本的已知限制,不是你的材质配置问题。


结论先说

目前 HarmonyOS 的:

GSPlugin

基本是:

独立渲染通道(独立 Render Pass)

并没有和 ArkGraphics3D 主场景做统一 ZBuffer 合并。

因此:

  • Geometry 无法遮挡 3DGS
  • 3DGS 也无法遮挡 Geometry
  • 不支持真正的 Depth Test 互操作

你现在这个:

3DGS + CubeGeometry线框

无法实现类似:

Unity / Unreal / Three.js

那种统一深度排序。


为什么会这样?

3DGS 本质不是普通 Mesh。

GSPlugin 内部通常是:

GPU Instancing + Splat Shader

或者:

Compute + Billboard

渲染方式。

而且为了性能:

  • 会自己做排序
  • 自己做 blending
  • 自己做 splat accumulate

很多 3DGS 引擎:

根本不写标准Depth Buffer

因为:

半透明高斯

和传统深度缓冲天然冲突。


你现在看到的本质

现在大概率是:

先渲染 ArkGraphics3D 后渲染 GSPlugin Overlay

或者:

GSPlugin 使用单独 RenderTarget

最终 compositing 到屏幕。

所以:

Depth 根本没共享


你问的几个核心问题

1. 是否支持与 Geometry 深度交互?

目前公开 API:

不支持

没有看到:

  • shared depth buffer
  • custom render pass
  • depth attachment injection
  • z-prepass interop

相关能力。


2. 是否能获取 GSPlugin DepthTexture?

目前也没有公开 API。

没有类似:

getDepthTexture()

或者:

attachDepthBuffer()

之类接口。


3. 能否通过材质强制开启 depthTest?

即使:

material.depthTest = true

也没用。

因为问题不是:

材质没开深度测试

而是:

两个系统不在同一个深度上下文


4. 能否自定义 GS Shader?

目前也不行。

GSPlugin 现在属于:

黑盒封装

没有:

  • shader hook
  • render callback
  • custom fragment
  • custom pass

能力。

你之前提到的:

Three.js patch fragment shader

那套目前在 HarmonyOS GSPlugin 上做不了。


目前官方能力更像:

Viewer / 展示组件

而不是:

完整可编程渲染管线


目前可行的替代方案

方案1:纯视觉假遮挡(推荐)

例如:

  • 让包围盒半透明
  • 降低亮度
  • 改为虚线
  • 使用 additive blending

视觉上弱化穿帮。

这是目前最现实方案。


方案2:把线框也做进 3DGS

例如:

  • 在 ply 预处理阶段
  • 将 box edge 转成 splat 点

这样:

整个场景都属于 GSPlugin

自然就有统一遮挡。

很多 3DGS 编辑器就是这么干。

缺点:

  • 线框不可实时编辑
  • 不是真 Geometry

方案3:双Pass深度图方案(理论可行)

理论流程:

GSPlugin → 输出深度图 Geometry → 读取深度图裁剪

但:

HarmonyOS 当前没开放

做不了。


方案4:自己实现3DGS渲染(重型方案)

不用:

GSPlugin

自己:

  • 解析 ply
  • 自写 Shader
  • 用 ArkGraphics3D / Native XComponent
  • Vulkan/OpenGL ES

实现 Gaussian Splatting。

这样:

深度完全可控

但工程量极大。


你当前这个需求在业界其实很典型

尤其:

  • AR空间裁切
  • 工业扫描
  • 空间标注
  • 房间切片
  • Bounding Box

都会要求:

3DGS 与 Geometry 深度融合

但现在很多移动端 3DGS SDK 都还没开放这能力。


你这个截图其实说明了一个关键点

你那个:

白色线框完全浮在最上层

说明:

GSPlugin 连 Depth Write 都没参与

否则至少会局部遮挡。


一句话总结

目前 HarmonyOS 的:

@hms.graphics.spatialRender.GSPlugin

渲染 3DGS 时,尚未与:

@kit.ArkGraphics3D

共享深度缓冲,因此:

不支持 Geometry 与 3DGS 的真实深度遮挡

当前没有公开 API 支持:

  • 自定义 GS Shader
  • 注入 RenderPass
  • 获取 GS DepthTexture
  • clip plane / AABB depth clipping

现阶段更建议:

纯视觉方案

或者:

将辅助几何也转成 splat

来规避。

更多关于HarmonyOS鸿蒙Next中3DGS能否与几何体做深度遮挡?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


厉害!

在HarmonyOS Next图形渲染中,3DGS(3D高斯泼溅)可以通过深度测试与几何体实现深度遮挡。需在渲染管线中正确配置深度缓冲区(depth buffer)、启用深度写入与测试,并确保3DGS的深度值计算与几何体一致。这样即可实现正确的前后遮挡关系。

当前 spatialRender.GSPlugin 渲染的 3DGS 使用独立的渲染管线,与 ArkGraphics3D 的深度缓冲区并未共享。因此场景中的高斯点云与几何体之间无法进行深度比较,表现为 3DGS 始终覆盖在其他几何体上层,无法实现正确的相互遮挡。

这是当前版本的已知限制,后续版本计划统一深度缓冲以实现正确的混合渲染。

回到顶部