2017-01-15 9 views
1

UPDATE: Проблема заключалась в том, что объект texData воссоздавался каждый раз, и поэтому ссылка на DataTexture была потеряна. Решение WestLangley состояло в том, чтобы перезаписать данные в texData вместо воссоздания объекта texData.Тройка DataTexture не обновляется

У меня есть простая трехмерная сцена с DataTexture в ShaderMaterial. Массив данных, переданный ему один раз во время инициализации, обновляется в событиях мыши. Однако 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