【问题标题】:Three.js time uniform won't updateThree.js 时间统一不会更新
【发布时间】:2016-05-14 13:44:32
【问题描述】:

这将是我关于堆栈溢出的第一个问题:)。 On-render 是一种由渲染循环调用的方法,我试图更新着色器的时间统一。它似乎在第一次尝试时更新,因为如果我更改除数并重新加载,我会看到渲染的内容发生了变化,但我看不到动画/随时间的变化。我可以看到时间值从最后一个 println 语句开始增加。我不认为 .needsUpdate true 上的任何内容对于制服都是必需的,但我添加它们只是为了检查。在成功之前,我已经在其他代码中更新了时间制服。这次我做错了什么?我在最新的 three.js 开发分支上。我的下一个想法是找出在 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

【问题讨论】:

    标签: three.js clojurescript


    【解决方案1】:

    我认为它的答案必须与 Shader Time Uniform - clock_gettime being truncated 相同。如果我从程序开始而不是仅仅 getTime() 做增量,我很好(现在)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 2017-06-20
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多