2016-12-05 4 views
0

J'ai actuellement un problème de transparence. Comme vous pouvez le voir sur les images, les objets non transparents derrière l'objet transparent sont affichés. Mais le backside de l'autre objet transparent n'est pas montré, j'ai mis material.side = THREE.DoubleSide.Objet transparent cache d'autres objets transparents (alphaTest ne fonctionne pas et depthWrite = false provoque des problèmes)

Il est visible, lorsque je définis material.depthWrite = false, mais le problème est alors visible, vous pouvez voir dans la deuxième image. J'utilise THREE.MeshPhongMaterial et la toute dernière version de Three.js. Voici les valeurs pour le matériel que vous pouvez voir dans l'image

material.color.setHex(0x9ed7f5); 
material.emissive.setHex(0x062f61); 
material.transparent = true; 
material.opacity = 0.5; 
material.needsUpdate = true; 
material.reflectivity = 0.8; 
material.envMap = textureCube; 
material.side = THREE.DoubleSide; 
material.roughness = 0.2; 
material.metalness = 1; 
depthWrite = true; 

enter image description here

depthwrite = false; 

enter image description here

Voici comment il doit chercher, ne fonctionne que si l'objet est derrière Occultant enter image description here

Il semble que de l'autre côté, je peut voir l'objet transparent derrière. Pour compléter ma confusion à propos de ce problème, je dois poster une autre photo. Ici vous pouvez voir l'image (1) juste de l'autre côté (scène tournée de 180 °) comme vous pouvez voir que la vue est différente car il y a un objet manquant dans le dos (également transparent) qui est montré dans l'autre vue . Tous ces objets ont exactement le même matériau!

enter image description here

Le envmap textureCube est créé comme suit

textureCube = new THREE.CubeTextureLoader().load(urls); 
textureCube.format = THREE.RGBFormat; 
var shader = THREE.ShaderLib["cube"]; 
shader.uniforms["tCube"].value = textureCube; 
var shaderMaterial = new THREE.ShaderMaterial({ 
    fragmentShader: shader.fragmentShader 
    , vertexShader: shader.vertexShader 
    , uniforms: shader.uniforms 
    , depthWrite: false 
    , side: THREE.BackSide 
}); 
var skyBox = new THREE.Mesh(new THREE.BoxGeometry(1500, 1500, 1500), shaderMaterial); 
scene.add(skyBox); 
+0

avez-vous un violon? – gaitat

+0

non:/mais peut-être que je dois commencer à l'utiliser – Dubbox

Répondre

1

I ne peut pas tout à fait faire ressortir votre problème à partir de vos photos, mais pouvez-vous me dire si c'est la même ing? Allez dans threejs.org/docs/#Reference/Materials/MeshStandardMaterial, dans l'exemple live, réglez ambiant sur blanc, activez transparent dans le matériau et définissez l'opacité sur environ 0,7. Pouvez-vous voir la façon dont la partie transparente du tore au premier plan obstrue les autres parties quand elles passent derrière? Cela peut prendre du temps mais si vous le regardez tourner, vous devriez voir ce que je veux dire.

Malheureusement, il s'agit d'une limitation de WebGL, pas de quoi que ce soit qui puisse être corrigé par three.js pour le moment.

+0

Ok, oui c'est exactement mon problème. Merci pour cette réponse, maintenant je sais que ce n'est pas causé par une erreur de programmation de ma part. – Dubbox

0

Lors de la création d'un objet transparent, essayez de premultipliedAlpha à true, et qui pourrait résoudre le problème:

var material = new THREE.MeshPhongMaterial({color: 'color', transparent: true,opacity:0.5,premultipliedAlpha: true}); 
+0

un vieux problème que je viens de revenir, ne m'aidera pas jusqu'à présent:/ – Dubbox

+0

Voir si la définition de 'premultipliedAlpha' à' vrai' fonctionne –

+0

Ne fonctionne pas, juste essayé il. Je viens de comprendre que de l'autre côté, vous pouvez voir l'autre objet transparent (voir la nouvelle image dans la poste).Peut-être qu'il y a un problème avec mon objet 3D, parce que l'objet est montré à travers l'objet transparent et l'autre pas? – Dubbox