シェーダの属性の値を変更して、これを次のフレームレンダリングのためにバッファに反映させることはできますか?three.js:頂点シェーダの属性値を変更してバッファに渡す
たとえば、頂点シェーダの頂点の位置を変更して、この新しい値をJavaScriptバッファオブジェクトに戻しますか?以下
コードサンプル:
attribute vec3 newPosition;
attribute vec3 divideVal;
void main() {
vec3 difference = newPosition - position;
velocity = difference/divideVal;
position += velocity;
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
gl_PointSize = size * (sizeMultipler/-mvPosition.z);
gl_Position = projectionMatrix * mvPosition;
}
編集:今私はJS自体でこれを行うが、私はできるように私はシェーダにできるだけ多くの計算を移動した場合、それはより速くなります理解
?これは私の現在のJSです:
const positions = this.geometry.attributes.position.array;
const newPositions = this.geometry.attributes.newPosition.array;
for (let i = 0, i3 = 0; i < this.numParticles; i++, i3 += 3) {
const velocity = [newPositions[i3] - positions[i3], newPositions[i3 + 1] - positions[i3 + 1], newPositions[i3 + 2] - positions[i3 + 2]];
if (velocity[0] || velocity[1] || velocity[2]) {
const minReset = 1;
velocity[0] = velocity[0]/60;
velocity[1] = velocity[1]/60;
velocity[2] = velocity[2]/60;
positions[i3] = positions[i3] + velocity[0];
positions[i3 + 1] = positions[i3 + 1] + velocity[1];
positions[i3 + 2] = positions[i3 + 2] + velocity[2];
}
}
ええけど、それはGLSLとは何の関係もありません。 three.jsレベルでははるかに抽象的です。 'Geometry'や' BufferGeometry'の両方を更新して、もっとコードを共有することでこれを行うことができますか? – pailhead
あなたはwebgl2トランスフォームのフィードバックを使用することができます(ここでは非常に簡単な例があります:https://www.ibiblio.org/e-notes/webgl/gpu/bounce.htm)が、どのようにフックできますか分かりませんこれはthree.jsで、おそらく 'object.onBeforeRender'を使用しています。 –
コードが追加されました。 –