Я рендерил огромное облако точек (1,5 млн. Точек) в виде GLPoints с WebGL и, естественно, сталкиваюсь с проблемами производительности.
Итак, моя первая идея - ограничить количество точек, нарисованных на экране. Особенно точки, удаленные от камеры, «бесполезны» и не должны отображаться.
Я сделал это, рассчитав расстояние между любой точкой и камерой. В моем вершинном шейдере я хотел бы отображать только точки, "достаточно близкие" к камере. Пока что я пытаюсь пропустить их, если расстояние «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 млн. вычисления в цикле рендеринга не очень хорошая идея.
Правильно ли я понимаю, что, как только моя камера смотрит в совершенно ином направлении, чем мои точки, они должны автоматически обрезаться WebGl / оборудованием? Тем не менее, я чувствую, что отстранение от глаз не помогает. (FPS не пошел вверх) Может кто-нибудь, пожалуйста, немного elaborte!
Движок, который я использую, имеет матрицу проекции перспективы по умолчанию. Очевидно, что это влияет на координаты каждой вершины. Как матрица проекции связана с автоматическим отсечением?