放大时增加点长
Increase point length when zoom in
我为 three.js 编写了一个自定义着色器,所以这些点是四舍五入的。着色器如下:
new ShaderMaterial({
transparent: true,
depthWrite: false,
uniforms: {
size: { value: pointSize * canvasSize * 0.5 },
color: { value: [...color, opacity ?? 1] },
},
vertexShader: `
uniform float size;
void main() {
gl_PointSize = size;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragmentShader: `
uniform vec4 color;
void main() {
if (length(gl_PointCoord - vec2(0.5)) > 0.5) discard;
gl_FragColor = color;
}
`
})
但我还需要在相机放大时增加点大小。我该怎么做?
当前不希望出现的缩放行为:
要得到每个点离相机有多远,可以通过乘以原始position * modelViewMatrix
得到模型-视图-位置。然后使用该结果的 .z
分量来获取它到相机的距离:
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_Position = projectionMatrix * mvPosition;
float depth = -mvPosition.z;
我不确定您要做什么,但从您发布的 GIF 来看,您似乎使用的是正交相机,它没有透视缩放,也就是尺寸衰减。如果你想强制它,你必须手动更改点大小
gl_PointSize = size / depth;
哦,我找到答案了!
根据 this 的 FOV 是 projectionMatrix[0][0]
,因此将点大小更改为以下解决了我的问题:
gl_PointSize = size * projectionMatrix[0][0];
我为 three.js 编写了一个自定义着色器,所以这些点是四舍五入的。着色器如下:
new ShaderMaterial({
transparent: true,
depthWrite: false,
uniforms: {
size: { value: pointSize * canvasSize * 0.5 },
color: { value: [...color, opacity ?? 1] },
},
vertexShader: `
uniform float size;
void main() {
gl_PointSize = size;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragmentShader: `
uniform vec4 color;
void main() {
if (length(gl_PointCoord - vec2(0.5)) > 0.5) discard;
gl_FragColor = color;
}
`
})
但我还需要在相机放大时增加点大小。我该怎么做?
当前不希望出现的缩放行为:
要得到每个点离相机有多远,可以通过乘以原始position * modelViewMatrix
得到模型-视图-位置。然后使用该结果的 .z
分量来获取它到相机的距离:
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_Position = projectionMatrix * mvPosition;
float depth = -mvPosition.z;
我不确定您要做什么,但从您发布的 GIF 来看,您似乎使用的是正交相机,它没有透视缩放,也就是尺寸衰减。如果你想强制它,你必须手动更改点大小
gl_PointSize = size / depth;
哦,我找到答案了!
根据 this 的 FOV 是 projectionMatrix[0][0]
,因此将点大小更改为以下解决了我的问题:
gl_PointSize = size * projectionMatrix[0][0];