从 GL_POINT 到相机的距离确定 gl_PointSize

Posted

技术标签:

【中文标题】从 GL_POINT 到相机的距离确定 gl_PointSize【英文标题】:Determine gl_PointSize from distance of a GL_POINT to the camera 【发布时间】:2016-06-10 17:21:45 【问题描述】:

我正在使用 GL_POINTS 绘制 glDrawArrays(GL_POINTS, 0, numberOfPoints) 每个点的大小在我的顶点着色器中使用gl_PointSize 设置。我从glm::lookAt(origin, eye, up) 获取视图矩阵。在顶点着色器中使用gl_Position = view * proj * vec4(position, 1.0) 设置点的xyz 位置。我希望点的大小随着与相机原点的距离的减小而增加,并且随着与相机原点的距离的增加而减小。就像正常的视角一样。我如何确定一个点的大小,从它到相机的距离?

【问题讨论】:

这取决于。你想要它有多大?这里没有正确的答案;你的问题不是很具体。 编辑了问题。 【参考方案1】:

这是我最近创建的一个顶点着色器来实现这一点。

precision mediump float;
attribute vec3 position;

uniform mat4 model, view, projection;
uniform float pointsize;
uniform vec3 cameraeye;

void main(void) 
    gl_Position = projection * view * model * vec4(position.xyz, 1.0);
    gl_PointSize = pointsize - (distance(cameraeye, position.xyz) / pointsize);

pointsize 是点的初始大小和最大大小 cameraeyevec3 相机的世界位置 可以删除model 矩阵。我在实现中使用恒等矩阵值。

【讨论】:

很好,但是如何处理相机视野,因为如果我改变视野,点大小仍然相同,但看到的其他物体会改变,谢谢 @Abojemyeg 好问题。我认为您可以从view 矩阵中提取近或远值,然后将其添加到点大小方程中。 能否请您用新方程式更新答案,因为我什至不明白远近与视野的关系,甚至视野如何影响屏幕上的对象大小跨度> 【参考方案2】:

只需将点大小设置为ref / ptCoord.zref 是距离1.0 时所需的点大小。

【讨论】:

请注意,点具有实现定义的最大大小。

以上是关于从 GL_POINT 到相机的距离确定 gl_PointSize的主要内容,如果未能解决你的问题,请参考以下文章

估计从相机到地平面点的距离

从相机到物体的距离.. 纠错

确定图像中车辆的距离(Matlab,OpenCV)

单目,双目,深度相机比较

如何测量物体或人脸与相机的距离

深度贴图的提取深度值