これはスタックオーバーフローに関する私の最初の質問です:)。 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を起動することができます。