这将是我关于堆栈溢出的第一个问题:)。渲染是一种通过渲染循环调用的方法,我试图更新着色器的时间统一。它似乎在第一次尝试时更新,因为如果我更改除数并重新加载,我会看到渲染内容的变化,但我看不到动画/随时间的变化。我可以看到时间值从最后一个println语句开始增加。我不认为.needsUpdate上的任何内容都应该是制服所必需的,但我添加它们只是为了检查。我成功之前在其他代码中更新了时间制服。这次我做错了什么?我在最新的three.js dev分支上。我的下一个想法是弄清楚在three.js中添加println语句的位置,以查看那里的制服发生了什么。
编辑:我取得了进展。如果我将时间设置为随机值而不是时间,我可以看到闪烁/动画。(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。
答案 0 :(得分:0)
我认为它必须与Shader Time Uniform - clock_gettime being truncated的答案相同。如果我从程序启动而不是只是getTime()做deltas,我没关系(现在)。