【发布时间】:2011-11-10 20:56:54
【问题描述】:
我正在使用 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没上)谁能详细说明一下!
我使用的引擎有一个默认的透视投影矩阵。显然它会影响每个顶点的坐标。投影矩阵与自动裁剪有什么关系?
【问题讨论】:
-
欢迎来到 StackOverflow,希望您阅读FAQ。
-
嗨,克里斯蒂安。我读了它,但它没有详细介绍礼仪。显然不应该问候或感谢其他用户?对吗?
-
不是那么严格,但它用不必要的喋喋不休使问题变得臃肿。但我在评论中没有提到这一点。我只是想确保您了解该网站的运作方式,因为新手有时会将其误认为是一个论坛。对不起,如果我的评论让您感到困惑,您的问题实际上还不错。
-
在两个答案中查看我的 cmets。软件截锥体剔除绝对不能解决您的问题。只需在顶点阶段完成其工作后,让 OpenGL 的硬件视图截头截体剪裁即可。顺便说一句,这不是答案,应该是原始问题的评论或附件。
-
您只需要调整投影矩阵以获得更紧密的远平面。如果您不知道怎么做,或者不知道什么是远平面,那么请深入研究基本的 3D 计算机图形,尤其是变换。
标签: opengl-es-2.0 shader webgl vertex