Я делаю аттрактор Лоренца в webgl и вообще играю с многомерными странными аттракторами. Я сделал для этого систему частиц, основанную на webgl, которая по большей части работает нормально. Система частиц работает, отображая значения x и y gl.POINTS, сохраняя при этом более высокие измерения в том же буфере для вычисления их соответствующей производной. Пример буфера: x=buffer[i], y=buffer[i+1], z=buffer[i+2], w=buffer[i+3] и так далее.
Я заметил, что точки исчезают, когда z выше 1. Это еще одна проблема, которую я не могу решить в данный момент, поэтому я обхожу ее, просто полностью перебирая значения, поскольку z в любом случае не должен быть частью визуализации. , но эта система шагов не работает.
Я знаю, что альтернативным решением было бы сделать копию массива позиций, содержащую только значения x и y, и передать ее в шейдерную программу как двумерную систему, и это работает! Это устраняет проблему «исчезающих точек», но вызывает некоторую задержку при большом количестве частиц из-за сборки мусора, без которой я бы хотел обойтись.
Это код буфера:
dims = 3;
drawScene(gl, program, positions) {
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
var positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
// positions is array of x,y,z coordinates
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
gl.enableVertexAttribArray(positionAttributeLocation);
const size = this.dims;
const type = gl.FLOAT;
const normalize = true;
const stride = 4 * (this.dims-2); // gl.FLOAT=4 bytes, then stride +1 extra per dim above 2
const offset = 0;
gl.vertexAttribPointer(
positionAttributeLocation, size, type, normalize, stride, offset);
const primitiveType = gl.POINTS;
const count = positions.length / this.dims;
gl.drawArrays(primitiveType, offset, count);
}