从 SVF 更新到 SVF2 后,法线在自定义着色器中中断

Posted

技术标签:

【中文标题】从 SVF 更新到 SVF2 后,法线在自定义着色器中中断【英文标题】:Normals broke in a custom shader after update from SVF to SVF2 【发布时间】:2021-09-21 16:53:26 【问题描述】:

您好,最近在我们的 Forge Autodesk 查看器中,我们通过将查看器初始化选项更改为从使用 SVF 切换到使用 SVF2


    env: "MD20ProdUS",
    api: "D3S",

按照您的团队向我们提出的建议。然而,这导致我们的自定义着色器放错了法线。我们怀疑是不同打包的问题,​​因为在我们的着色器中,我们使用了一个方便的函数来解包法线值。

const float PI = 3.141592;
vec3 DecodeNormal (vec2 enc)

    vec2 ang = enc * 2.0 - 1.0;
    vec2 scth = vec2(sin(ang.x * PI), cos(ang.x * PI));
    vec2 scphi = vec2(sqrt(1.0 - ang.y * ang.y), ang.y);
    return vec3(scth.y * scphi.x, scth.x * scphi.x, scphi.y);

这个函数的输入只是normal.xy

我们有一个自定义着色器,它以颜色渐变显示法线,当使用相同的着色器应用于同一模型时,我们会根据我们使用的查看器版本(SVF 或 SVF2)得到不同的结果 SVF SVF2 我希望图像是可见的,并且您能够解决我们的问题。当我们第一次实现自定义着色器时,我们遇到了同样的问题,但是法线解包功能最初解决了这个问题,这就是为什么我们怀疑这是我们头痛的原因。

【问题讨论】:

【参考方案1】:

我们需要与观众团队核实更多细节,但与此同时:

SVF2 格式可以以几种不同的方式对法线进行编码(使用两个 shorts 或 ushorts,如您所见 here),并且查看器可能会保持正常数据原样即使将其发送到 GPU,这意味着您需要修改 WebGL 着色器以解决这些问题。我建议您更新您的 DecodeNormal 辅助函数以遵循链接中使用的逻辑,并查看法线是否正确输入。

【讨论】:

很遗憾,您在链接中发送的函数使用的解码机制与我已经在我的问题中发布的相同,它给出的结果不正确。除非除了您突出显示的部分之外还有其他部分,您建议的修复不起作用。

以上是关于从 SVF 更新到 SVF2 后,法线在自定义着色器中中断的主要内容,如果未能解决你的问题,请参考以下文章

Autodesk Forge Viewer - SVF2 格式的无效 OGT 标头

使用 SVF2 时,await AggregateView.waitForLoadDone() 有时会无限期阻塞

无法在 Autodesk Forge Viewer 中加载 SVF2 模型

Autodesk Forge Data Viz 组件适用于 SVF 模型,但不适用于 SVF2 模型

使用 Model Derivative api 的 BIM 360 设计能够看到 SVF2

在顶点着色器中定位顶点后如何更新法线?