2017-01-15 17 views
1

UPDATE:毎回texDataオブジェクトが再作成され、DataTextureの参照が失われていた問題がありました。 WestLangleyの解決策は、texDataオブジェクトを再作成する代わりに、texDataのデータを上書きすることでした。Threejs DataTextureが更新されない

ShaderMaterialDataTextureという単純な3JSシーンがあります。初期化中に一度渡されたデータ配列は、マウスイベントで更新されます。しかし、DataTextureは更新されていないようです。

私はユニフォームまたはテクスチャデータを間違って割り当てましたか?またはneedsUpdateフラグを誤って使用していますか?毎回テクスチャ、マテリアル、メッシュ、シーンオブジェクトを削除して再作成するときには機能しますが、再現できない多くの例からわかるように、これは本当に必要ではありません。

データ自体は、DataTextureではなく、うまく更新されます。

// mouse event triggers request to server 
// server then replies and this code here is called 
// NOTE: this code **is** indeed called on every mouse update! 

// this is the updated data from the msg received 
// NOTE: texData **does** contain the correct updated data on each event 
texData = new Float32Array(evt.data.slice(0, msgByteLength)); 

// init should happen only once 
if (!drawContextInitialized) { 

    // init data texture 
    dataTexture = new THREE.DataTexture(texData, texWidth, texHeight, THREE.LuminanceFormat, THREE.FloatType); 
    dataTexture.needsUpdate = true; 

    // shader material 
    material = new THREE.ShaderMaterial({ 
     vertexShader: document.querySelector('#vertexShader').textContent.trim(), 
     fragmentShader: document.querySelector('#fragmentShader').textContent.trim(), 
     uniforms: { 
      dataTexture: { value: dataTexture } 
     } 
    }); 

    // mesh with quad geometry and material 
    geometry = new THREE.PlaneGeometry(width, height, 1, 1); 
    mesh = new THREE.Mesh(geometry, material); 

    // scene 
    scene = new THREE.Scene(); 
    scene.add(mesh); 

    // camera + renderer setup 
    // [...] 

    drawContextInitialized = true; 

} 

// these lines seem to have no effect 
dataTexture.needsUpdate = true;  
material.needsUpdate = true; 
mesh.needsUpdate = true; 
scene.needsUpdate = true; 

renderer.render(scene, camera); 
+0

があります代わりに、そのような配列要素を更新データを更新するたびに 'dataTexture.needsUpdate = true; 'を設定しますか? – WestLangley

+0

はい、コードの一番下を見てください(途中までスクロールしてください)。 これはマウスイベントのデータを更新する場所を示す 'texData'の割り当て – Mangostaniko

+0

と同じです。 – WestLangley

答えて

1

DataTextureデータを更新する場合は、新しい配列をインスタンス化しないでください。また

texData.set(javascript_array); 

、あなたはテクスチャデータを更新するときに設定する必要がある唯一のフラグは次のとおりです:

dataTexture.needsUpdate = true; 

three.js r.83

関連する問題