Three.js で移動カメラを使用してループ 3D スターフィールドに取り組んでいますが、CPU でこれを行うとフレームレートが低下します。これがバーテックスシェーダーでなんとかできたらいいなと思います。
これは、シェーダーでやりたいことの JavaScript コードです。
SW.Starfield = function ( position, scene ) {
var scale = 10000;
var particleCount = 2000;
var x, y, z;
var particles;
var material = new THREE.ParticleBasicMaterial( { sizeAttenuation: false, size: 1, color: '#FFFFFF' } );
var geometry = new THREE.Geometry();
for ( var i=0; i <= particleCount; i++ ) {
do {
x = Math.random() * scale - scale/2 + position.x;
y = Math.random() * scale - scale/2 + position.y;
z = Math.random() * scale - scale/2 + position.z;
} while (new THREE.Vector3( x, y, z ).length()> scale/2);
geometry.vertices.push( new THREE.Vector3( x, y, z ) );
}
particles = new THREE.ParticleSystem( geometry, material );
particles.dynamic = true;
particles.position = position;
particles.sortParticles = true;
scene.add( particles );
this.update = function( shipPos ) {
for ( i=0; i <= particleCount; i++ ) {
var particleVec = new THREE.Vector3().copy( particles.geometry.vertices[ i ] );
var shipVec = new THREE.Vector3().copy( shipPos );
if ( shipVec.sub(particleVec).length() >= scale/2 ) {
particles.geometry.vertices[ i ].add(shipVec.multiplyScalar(2.0));
}
}
}
}
私がそれを正しく理解していれば、星の位置をテクスチャに保存して、これをシェーダーで機能させる必要があります.この場合の方程式。更新機能を見れば、私の言いたいことが明確になるはずです。
Three.jsでこれを行う方法はありますか? 色を保存できることがわかっています。おそらく、位置を色としてエンコードできますが、位置は色よりもはるかに高い値を持つことができ、負の値も持つことができます。