2017-02-11 2 views
0

zu puffern Ist es möglich, den Wert eines Attributs im Shader zu ändern und diese in dem Puffer reflektiert für das nächste Bild machen?three.js: Attribute ändern Wert in Vertex-Shader und übergeben

So zum Beispiel ändern, um die Position eines Knotens in den Vertex-Shader und diesen neuen Wert an das JavaScript-Puffer-Objekt zurückschicken?

Codebeispiel unten:

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; 
} 

Edit:

Gerade jetzt ich tun dies in der JS selbst, sondern verstehen es schneller sein wird, wenn ich so viel Berechnung bewegen, wie ich an den Shadern kann? Dies ist meine aktuelle 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]; 
    } 
} 
+0

Ja, aber es hat nichts mit GLSL zu tun. Auf einer Ebene von drei .js ist es viel abstrakter. Sie können dies tun, indem Sie die Aktualisierung sowohl 'Geometry' oder' BufferGeometry', mehr Code teilen? – pailhead

+0

können Sie verwenden webgl2 für das Feedback-Transformation (hier ein sehr einfaches Beispiel ist: https://www.ibiblio.org/e-notes/webgl/gpu/bounce.htm), aber ich bin nicht sicher, wie Sie Haken kann dies mit three.js, vielleicht mit 'object.onBeforeRender'. –

+0

Weitere Code hinzugefügt. –

Antwort

0

Ich habe herausgefunden, wie dies zu tun ist.

Mithilfe eines Konzepts namens FBO-Simulation habe ich einen Simulations-Shader erstellt, der die Berechnungen in seinen Glsl-Shadern berechnet und die Ergebnisse dann nicht auf Bildschirmen anzeigt, sondern in eine Textur schreibt. Ich las dann von dieser Textur im "echten" Shader und schrieb die Ergebnisse auf den Bildschirm. Dies ermöglichte mir auch unterschiedliche Ausgänge Texturen zu vergleichen, um zu trainieren Geschwindigkeit und Größenunterschiede von Partikeln zwischen Frames.

Sie können mehr lesen über sie hier diskutiert: https://github.com/mrdoob/three.js/issues/1183

Beispiel: http://barradeau.com/blog/?p=621

Verwandte Themen