Вариант А:. Occlusion выбраковки, вам нужно будет найти библиотеку для этого.
Вариант B: Используйте тест плоскости AABB с камерой. Фрустальные плоскости и ограничивающий объект поле, это скажет вам, находится ли объект в поле зрения камеры. (Не обязательно видны за объектом, так как такая операция невозможна, это в основном, вероятно, уже сделано в некоторой степени с WebGL)
реализации: Google это три JS, вероятно, поддерживает этот
Вариант C : Используйте максимальный объект render Limit, приоритет основан на расстоянии от камеры и размере объекта. Например, подсчитайте, какие объекты видны (вариант B), затем назначьте приоритет ближайшим и самым большим и отключите остальные.
псевдо-код:
if(object is in frustum){
var priority = (bounding.max - bounding.min)/distanceToCamera
}
Убедитесь, что ваши шейдеры только делают один проход. Поскольку это удвоит время расчета (примерно в зависимости от ситуации)
Вариант D: raycast до восьми углов ограничивающего параллелепипеда, если все они не не оказывают объект. Это довольно точно, но отнюдь не идеально.
Вариант А будет лучше точно, используя Option C является большим, если вы не заботитесь, чтобы мелкие предметы далеко не будут выданы. Опция D хорошо работает с объектами с большим количеством вершин, вы можете захотеть увеличить количество точек объекта в зависимости от ситуации. Вариант B, вероятно, не будет полезен для вашего сценария, но его часть c и другие методы оптимизации. Во всем никогда не было чрезвычайно надежного и оптимального способа сказать, что что-то стоит за чем-то другим.
Окклюзионный отбор - это то, что вы хотите сделать. – gaitat
Thx, я прочитал его где-то давным-давно, но это сошло с ума;) –
Кажется, мне нужно сделать свою собственную окклюзию, я не нашел для нее решения, просто это: https: // github .com/wivlaro/three.js/blob/master/examples/webgl_occlusion_culling.html –