2016-05-14 33 views
0

これはスタックオーバーフローに関する私の最初の質問です:)。 On-renderは、シェーダーの時間の均一性を更新しようとしているレンダリングループによって呼び出されるメソッドです。私が除数とリロードを変更すると、レンダリングされたものの変化が見えますが、時間の経過とともにアニメーション/変化は見えないので、最初の試行で更新するようです。私は時間の値が最後のprintlnステートメントから増加しているのを見ることができます。 .needsUpdate trueはユニフォームには必要ではないと思いますが、チェックするために追加しました。私は正常に前に他のコードの時間の制服を更新しました。今回は間違って何をしていますか?私は最新のthree.js devブランチを利用しています。私の次のアイデアは、three.jsのどこにprintlnステートメントを追加してそこのユニフォームで何が起こっているのかを見極めることです。Three.jsタイムユニフォームは更新されません

編集:私は進歩しました。私は時間の代わりにランダムな値に時間を設定すると、私はフリッカー/アニメーションを見ることができます。

(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)) 
    )))) 

次のように私のフラグメントシェーダが(ちょうどその時間をテストするために変更される)である。

(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); 
} 
") 

次のように材料の初期化は、次のとおりです。

(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 
      }))) 

あなたは追加のコンテキストが必要な場合は、すべてのコードはgithubにコミットされており、hereを起動することができます。

答えて

関連する問題