3

我正在使用 WebGL 将巨大的点云(1.5 Mio. 点)渲染为 GLPoints,并且自然会遇到性能问题。

所以我的第一个想法是限制在屏幕上绘制的点数。特别是远离相机的点是“无用的”,不应该被渲染。

我通过计算任何点和相机之间的距离来解决这个问题。在我的顶点着色器中,我只想将点渲染得离相机足够近。到目前为止,如果距离“s”在相机和剪裁平面之间(因此为负数),我会尝试跳过它们。

if( s < 0.0){
  gl_Position = vec4(0.0, 0.0, 0.0, 0.0);
  frontColor = vec4(0.0, 0.0, 0.0, 1.0);
  gl_PointSize = 0.0;
}else{
  gl_Position = ps_ProjectionMatrix * ecPos4;
}

但是,正如我从显示的 FPS 中看出的那样,它仍然被渲染(即使我没有看到它),而不是完全跳过顶点。有没有办法完全禁用/跳过/“删除”顶点着色器中的顶点?


我可以看到截锥体剔除如何帮助加快速度。为了澄清事情,扑杀应该在什么时候进行?由于每次摄像机移动后都必须重新计算剔除,我应该放入主循环吗?但是做 1 Mio。渲染循环中的计算似乎不是一个好主意。

我是否正确理解,一旦我的相机看起来与我的点完全不同的方向,这些应该由 WebGl/硬件自动剪辑?然而,我觉得“远离”并没有帮助。(FPS 没上) 有人能详细说明一下吗!

我使用的引擎有一个默认的透视投影矩阵。显然它会影响每个顶点的坐标。投影矩阵与自动裁剪有何关系?

4

2 回答 2

2

听起来您需要调整投影矩阵,以便您的视锥剔除那些距离太远而无法对您的图像做出有意义贡献的点。这个来自 lighthouse3d 的教程提供了对视锥体的描述,并描述了在软件中实现基于视锥体的剔除的方法。请注意,这在您的情况下不是必需的,因为 OpenGL 会为您执行此操作,前提是您已正确设置投影矩阵。

于 2011-11-10T21:22:54.357 回答
1

首先,不,没有。您不能完全丢弃顶点。两个顶点的三角形是什么(当你丢弃第三个时)?您可以使用几何着色器在每个基元的基础上执行此操作,但恕我直言,WebGL 不支持。即使你只绘制点图元,顶点着色器仍然没有任何图元的概念,不能仅仅丢弃顶点。

您可以做的是将顶点移到查看体积之外。这样它就被剪掉了,你只需要为顶点着色器付费,既不需要光栅化(在使用大小为 1 的点时也不会花费太多),也不需要为片段着色器付费。

这似乎是您目前想要做的,但实际上将顶点的 w 坐标设置为 0 并不是一个好主意,这会导致在透视分割期间出现未定义的行为。只需将其设置在规范视图体积之外([-1,1] 立方体):

if( s < 0.0 )
    gl_Position = vec4(2.0, 0.0, 0.0, 1.0);
else
    gl_Position = ps_ProjectionMatrix * ecPos4;

你也不需要弄乱gl_PointSize. 将它的位置设置在查看体积之外就足够了。

编辑:但在你的情况下,詹姆斯回答的解决方案要容易得多。只需更改投影矩阵的远平面,其任务就是剪掉太远的物体。

于 2011-11-10T21:24:29.047 回答