В качестве способа обучения себе WebGL и Three.js я создаю простую демоверсию / игру.Идея в 3D-версии этого: https://www.youtube.com/watch?v=cYpE8-4_YBk&t=75s - перемещаться по отверстию и не падать.
Я хочу создать динамическую "трубу", используя вершины, рассчитанные на летуПримерно так:
for ( var p = 0 ; p < LIMIT ; p++ ) {
r = RADIUS + Math.random();
let x = CX + (r * Math.cos(ANGLE));
let y = CY + (r * Math.sin(ANGLE));
let z = - ( p / DENSITY );
let v = new THREE.Vector3( x, y, z );
tube.vertices.push( v );
tube.faces.push( new THREE.Face3( p, p-offset[0], p-offset[2] ) );
tube.faces.push( new THREE.Face3( p, p-offset[2], p-offset[1] ) );
// update calculation parameters
CX += ( Math.random() - 0.5 ) * 0.1;
CY += ( Math.random() - 0.5 ) * 0.1;
RADIUS += ( Math.random() - 0.5 ) * 0.1;
if ( RADIUS < MIN_RADIUS ) RADIUS = MIN_RADIUS;
if ( RADIUS > MAX_RADIUS ) RADIUS = MAX_RADIUS;
ANGLE += INCREMENT;
}
У меня это работает, когда вершины вычисляются один раз как статическая сетка, которая затем загружается в графический процессор и анимируется по направлению к камере.Нет интерактивности, пока.https://codepen.io/jarrowwx/pen/gKraVm
Следующий шаг - сделать его бесконечным.Это означает, что мне придется делать это по-другому.
Один из способов, которым я мог бы это сделать, - сохранить достаточное количество вершин в массиве, вычисляя новые вершины по ходу работы, достаточно, чтобы компенсироватьрасстояние, пройденное с момента последнего шага по времени.Затем, раз в секунду или около того, восстановите массив лиц и восстановите сцену.Но это означает, что раз в секунду, вероятно, будет заметное отставание.
Но поскольку все вершины рассчитаны, имеет смысл выполнить всю работу на GPU и избежать задачи передачи данных в первомместо.
Как можно было бы построить такую структуру данных на GPU, чтобы данные никогда не передавались из CPU в GPU?И затем, как только вы это сделаете, как вы будете постоянно расширять его, когда камера летит через него?