Как динамически построить геометрию вершины на графическом процессоре - PullRequest
0 голосов
/ 05 июня 2018

В качестве способа обучения себе 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?И затем, как только вы это сделаете, как вы будете постоянно расширять его, когда камера летит через него?

...