Glsl 是否可以使用Three.js在纹理中存储着色器顶点位置?

Glsl 是否可以使用Three.js在纹理中存储着色器顶点位置?,glsl,three.js,Glsl,Three.js,我正在用一个移动的摄像机在Three.js中制作一个循环的3D星场,但是在CPU上这样做对我的帧速率不好。这将是伟大的,如果这将能够以某种方式由顶点着色器完成 这是我想在着色器中执行的javascript代码: SW.Starfield = function ( position, scene ) { var scale = 10000; var particleCount = 2000; var x, y, z; var particles; var

我正在用一个移动的摄像机在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));
            }
        }
    }
}
SW.Starfield=功能(位置、场景){
var标度=10000;
var particleCount=2000;
变量x,y,z;
var粒子;
var material=新的三种。刨花板材质({sizeAttenuation:false,size:1,颜色:'#FFFFFF'});
var geometry=new THREE.geometry();
对于(变量i=0;i标度/2);
几何。顶点。推(新的三个向量3(x,y,z));
}
粒子=新的三个粒子系统(几何体、材料);
粒子。动态=真;
粒子。位置=位置;
particles.sortParticles=true;
场景。添加(粒子);
this.update=功能(shipPos){
对于(i=0;i=scale/2){
particles.geometry.vertices[i].add(shipVec.multilyscalar(2.0));
}
}
}
}
如果我理解正确,我必须将恒星的位置存储在纹理中,以便在着色器中工作,因为我认为在这种情况下,你不能仅从恒星的初始位置用方程计算它们的新位置。如果你看一下update函数,就会明白我的意思


有没有办法在Three.js中实现这一点?我知道可以储存颜色。也许我可以将位置编码为颜色,但是位置的值可以比颜色的值高很多,也可以是负值。

Google GPGPU和three.js

网上有几个例子。他们大多数都是老的

这是最近的一个例子:


three.js r.56dev.

完美!查看链接的来源,有一个名为THREE.DataTexture()的文件。这应该能奏效。谢谢韦斯特!哦,顺便说一句,谢谢你和杜布先生提供了这个很棒的框架。目前,我正在写关于three.js的第二篇学士论文。继续努力!谢谢你的客气话。:-)ping@mrdoob