Autodesk Forge Viewer 中的自定义点着色器在正交摄影机上表现异常

Posted

技术标签:

【中文标题】Autodesk Forge Viewer 中的自定义点着色器在正交摄影机上表现异常【英文标题】:Custom Point Shader in Autodesk Forge Viewer behaves weirdly with orthograpic Camera 【发布时间】:2021-03-12 11:56:02 【问题描述】:

在this blog post 之后,我正在使用 PointCloud 快速渲染精灵。透视相机一切正常。但是,如果我通过viewer.navigation.toOrthographic() 切换到正交相机,则无法正确计算点的大小。有谁知道问题是什么或者我可以在哪里找到一些线索?

我的顶点着色器

#if NUM_CUTPLANES > 0
varying highp vec3 vWorldPosition;
#endif
attribute float mVisible;
attribute float mSize;
varying float vMVisible;
uniform float scale;
void main() 
    vMVisible = mVisible;
    
    #if NUM_CUTPLANES > 0
    vec4 _worldPosition = modelMatrix * vec4( position, 1.0 );
    vWorldPosition = _worldPosition.xyz;
    #endif

    vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
    gl_Position = projectionMatrix * mvPosition;
    gl_PointSize = mSize * (scale / (-mvPosition.z) );

缩小

放大

再放大一点

【问题讨论】:

【参考方案1】:

问题出在片段着色器的最后几行:

vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
gl_Position = projectionMatrix * mvPosition;
gl_PointSize = mSize * (scale / (-mvPosition.z) );

使用orthographic projection instead of a perspective projection 时,mvPosition(转换为“标准化设备坐标”的位置)可能具有非常不同的值,因此将点大小除以mvPosition.z 可能会产生意想不到的结果。

您可能需要 clamp 通过一些常量(或通过您从 javascript 代码提供的制服)来确定最终点的大小,例如:

gl_PointSize = clamp(mSize * scale / -mvPosition.z, 10.0, 100.0);

【讨论】:

以上是关于Autodesk Forge Viewer 中的自定义点着色器在正交摄影机上表现异常的主要内容,如果未能解决你的问题,请参考以下文章

Autodesk Forge Viewer 中的三个 JS 限制变换控制运动

如何克服 Autodesk Forge Viewer 中的窗口选择限制?

Autodesk Forge Viewer 中的令牌续订

Autodesk Forge Viewer 适合查看纵向/横向

将模型从 Autodesk Viewer 加载到 Forge Viewer

如何将 Autodesk 模型衍生 API 元数据中的 objectids 与 Forge Viewer 模型 dbids 匹配?