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);
ли вы устанавливаете 'dataTexture.needsUpdate = true;' всякий раз, когда вы обновляете данные? – WestLangley
да, см. В самом конце кода (прокрутите вниз). Это в той же функции, что и задание 'texData'. – Mangostaniko
Показать, где вы обновляете данные о событиях мыши. – WestLangley