2016-05-14 8 views
0

Dies wird meine erste Frage auf Stack-Überlauf sein :). On-render ist eine Methode, die von rendering loop aufgerufen wird, die ich versuche, die Zeiteinheit für meine Shader zu aktualisieren. Es scheint beim ersten Versuch zu aktualisieren, denn wenn ich Divisor und Reload ändere, sehe ich eine Veränderung in dem, was gerendert wird, aber ich sehe keine Animation/Veränderung im Laufe der Zeit. Ich kann sehen, dass der Zeitwert seit der letzten println-Anweisung zunimmt. Ich glaube nicht, dass auf der .needsUpdate für Uniformen etwas notwendig sein sollte, aber ich fügte sie nur hinzu, um sie zu überprüfen. Ich habe Zeituniformen in anderem Code vorher erfolgreich aktualisiert. Was mache ich diesmal falsch? Ich bin auf der neuesten three.js Dev-Zweigstelle. Meine nächste Idee ist es, herauszufinden, wo in three.js println-Anweisungen hinzugefügt werden, um zu sehen, was mit den Uniformen dort geschieht.Three.js Zeit Uniform wird nicht aktualisiert

EDIT: Ich machte Fortschritte. Wenn ich Zeit auf einen zufälligen Wert anstelle der Zeit setze, kann ich Flackern/Animation sehen.

(defn on-render 
    [init-renderer component] 
    (let 
    [unit-meshes (engine/get-unit-meshes (:units component)) 
    divisor 1000.0 
    t (/ (common/game-time) divisor)] 
    (doseq 
     [mesh unit-meshes] 
     (let 
     [material (-> mesh .-material) 
     uniforms (-> material .-uniforms)] 
     (-> uniforms .-time .-value (set! t)) 
     (-> uniforms .-time .-needsUpdate (set! true)) 
     (-> uniforms .-needsUpdate (set! true)) 
     (-> material .-needsUpdate (set! true)) 
     (-> mesh .-needsUpdate (set! true)) 
     (println "value" (-> uniforms .-time .-value)) 
    )))) 

Mein Fragment-Shader ist wie folgt (nur, dass die Zeit zu testen, ändert sich):

(def standard-fragment-shader 
" 
#define RECIPROCAL_PI 0.31830988618 

varying vec2 vUV; 
varying vec3 vLightFront; 
uniform sampler2D map; 
uniform float time; 

void main() { 
    vec4 diffuseColor = texture2D(map, vUV); 
    vec3 directDiffuse = vLightFront * RECIPROCAL_PI * diffuseColor.rgb; 
    vec3 emissive = diffuseColor.rgb/3.0; 
    vec3 outgoingLight = directDiffuse + emissive * sin(time); 

    gl_FragColor = vec4(outgoingLight, diffuseColor.a); 
} 
") 

Das Material Initialisierung wird wie folgt:

(defn get-standard-material 
    [component] 
    (let 
    [light1 (data (:light1 component)) 
    light-direction (-> light1 .-position .clone) 
    _ (-> light-direction (.sub (-> light1 .-target .-position))) 
    uniforms 
    #js 
    { 
     :time #js { :value 0.0 } 
     :map #js { :value nil } 
     :offsetRepeat #js { :value (new THREE.Vector4 0 0 1 1) } 
     :lightDirection #js { :value light-direction } 
     :boundingBoxSize # js { :value (new js/THREE.Vector3) } 
     }] 
    (new js/THREE.ShaderMaterial 
     #js 
     { 
      :uniforms uniforms 
      :vertexShader standard-vertex-shader 
      :fragmentShader standard-fragment-shader 
      }))) 

Wenn Sie weitere Kontext benötigen, Der gesamte Code ist an GitHub gebunden und Sie können here starten.

Antwort