Autodesk Forge Viewer 中的自定义点着色器在使用正交相机时表现异常
Custom Point Shader in Autodesk Forge Viewer behaves weirdly with orthograpic Camera
我在 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) );
}
缩小
放大
再放大一点
问题出在片段着色器的最后几行:
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);
我在 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) );
}
缩小
放大
再放大一点
问题出在片段着色器的最后几行:
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);