Je travaille sur cet exemple http://meetar.github.io/threejs-shader-demos/llama.html qui utilise un gif animé comme carte de déplacement. Cependant, il utilise Three.js R58 et je suis en utilisant Three.js R85 et le code suivant de l'exemple ne fonctionne pas pour moiTHREEjs - utiliser un gif animé comme carte de déplacement - shaders
dispTexture = new THREE.Texture(llamacanvas);
var shader = THREE.ShaderLib[ "normalmap" ];
uniforms = THREE.UniformsUtils.clone(shader.uniforms);
uniforms[ "enableDisplacement" ] = { type: 'i', value: 1 };
uniforms[ "tDisplacement" ] = { type: 't', value: dispTexture };
uniforms[ "uDisplacementScale" ] = { type: 'f', value: 35 };
uniforms[ "enableDiffuse" ] = { type: 'i', value: 1 };
uniforms[ "tDiffuse" ].value = dispTexture;
uniforms[ "tNormal" ] = { type: 't', value: new
THREE.ImageUtils.loadTexture('flat.png')};
au premier var shader = THREE.ShaderLib[ "normalmap" ];
me donnait du mal - message d'erreur:
Uncaught TypeError: Cannot read property 'uniforms' of undefined
donc je remplacé normalmap
avec normal
, qui fixe cette erreur, mais uniforms["tDiffuse"].value = dispTexture
me donne un message d'erreur:
Uncaught TypeError: Cannot set property 'value' of undefined
C'est à ce moment que j'ai découvert l'énorme différence dans les constructions THREE.js. Je me demandais si quelqu'un peut m'aider à comprendre comment cela peut être mis en œuvre dans des versions plus récentes de THREE.js
Il a quelque chose à voir avec geometry.computeTangents();
qui faisait encore partie de r58, mais a été supprimé.
Merci!
mise à jour: Je continue à travailler sur ce sujet et je l'ai remplacé tDiffuse
avec diffuse
et chaque fois que les mises à jour de la boucle d'animation je reçois ce message d'erreur:
Uncaught TypeError: Cannot set property 'value' of undefined
La console me pointe vers une place dans trois .min.js, pas dans le code exemple j'utilise:
if (c.morphNormals)
for (m = c.numSupportedMorphNormals = 0; m < J.maxMorphNormals; m++)
0 <= l["morphNormal" + m] && c.numSupportedMorphNormals++;
l = h.__webglShader.uniforms;
if (!c.isShaderMaterial && !c.isRawShaderMaterial || !0 === c.clipping)
h.numClippingPlanes = Oa.numPlanes,
h.numIntersection = Oa.numIntersection,
l.clippingPlanes = Oa.uniform;
h.fog = b;
h.lightsHash = da.hash;
c.lights && (l.ambientLightColor.value = da.ambient,
l.directionalLights.value = da.directional,
l.spotLights.value = da.spot,
l.rectAreaLights.value = da.rectArea,
l.pointLights.value = da.point,
l.hemisphereLights.value = da.hemi,
l.directionalShadowMap.value = da.directionalShadowMap,
l.directionalShadowMatrix.value = da.directionalShadowMatrix,
l.spotShadowMap.value = da.spotShadowMap,
l.spotShadowMatrix.value = da.spotShadowMatrix,
l.pointShadowMap.value = da.pointShadowMap,
l.pointShadowMatrix.value = da.pointShadowMatrix);
m = h.program.getUniforms();
l = db.seqWithValue(m.seq, l);
h.uniformsList = l
}
c.needsUpdate = !1
}
Plus précisément, le programme arrête à
c.lights && (l.ambientLightColor.value = da.ambient,
ayant un problème avec da.ambient
. Je n'ai aucune idée de ce qu'il faut faire ensuite.
Compris cela. Beaucoup moins compliqué que je ne le pensais. En r85, je n'ai pas à m'inquiéter de configurer explicitement les uniformes. Tout ce que je devais faire était d'importer le gif, créer le matériel puis ajouter le gifCanvas: var supGif = nouveau SuperGif ({gif: document.getElementById ('gif1')}); supGif.load(); var gifCanvas = supGif.get_canvas(); matériau = nouveau THREE.MeshStandardMaterial(); material.displacementMap = nouveau TROIS.Texture (gifCanvas); – aeiou