UPDATE:毎回texDataオブジェクトが再作成され、DataTextureの参照が失われていた問題がありました。 WestLangleyの解決策は、texDataオブジェクトを再作成する代わりに、texDataのデータを上書きすることでした。Threejs DataTextureが更新されない
ShaderMaterial
にDataTexture
という単純な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);
があります代わりに、そのような配列要素を更新データを更新するたびに 'dataTexture.needsUpdate = true; 'を設定しますか? – WestLangley
はい、コードの一番下を見てください(途中までスクロールしてください)。 これはマウスイベントのデータを更新する場所を示す 'texData'の割り当て – Mangostaniko
と同じです。 – WestLangley