2012-06-22 13 views

risposta

10

Questo non è un bug, è solo il modo (e quindi, WebGL e,) lavora OpenGL. Le superfici trasparenti non giocano bene con il buffer z, e come tale devono essere ordinate manualmente e sottoposte a rendering a ritroso. Three JS sta tentando di fare questo per te (che è il motivo per cui il problema scompare quando si imposta il valore X> 0) ma non si può gestire il caso della geometria intersecante come si sta mostrando.

ho spiegato il problema più in profondità in un different SO question, quindi si consiglia di fare riferimento a questo.

+1

Grazie per la risposta, ma così mi stai dicendo che è meglio riprogettare il mio gioco o è una soluzione di hacking perseguibile Three.JS? – MaiaVictor

+1

@Toji la domanda a cui fai riferimento non ha esattamente lo stesso problema. Nell'altra domanda è solo una parte dell'oggetto/trama che è trasparente dove in questa domanda l'intero piano è trasparente e questo è facilmente risolvibile semplicemente disattivando il 'depthWrite' totalmente per il piano trasparente. – Wilt

15

Prova ad aggiungere alphaTest: 0.5 al materiale.

+0

L'ho provato, non ha funzionato:/Immagino sia un problema di webgl quindi devo ridisegnare il modo in cui il mio gioco mostra gli aerei. Comunque sembrerà un po 'violato. – MaiaVictor

+1

Ho un piano con una trama basata su tela mappata ad esso che visualizza il testo. In certi angoli/posizioni avevo problemi con la trasparenza del materiale della trama e questo l'ha risolto, quindi grazie! – plyawn

+3

Nota: 'alphaTest' è una sottostruttura che renderà le aree semitrasparenti nelle trame sia completamente opache (quando opacità pixel> treshold) o completamente trasparenti (quando opacità pixel Blaise

6

fwow, se hai molti piani paralleli (non riesci a vedere il tuo esempio, google non può risolvere il tuo dominio), è facile tenerli ordinati lungo l'asse perpendicolare. Per un elenco di piani [A B C D] l'ordine di partenza sarà [A B C D] o [D C B A] e nient'altro! Quindi non c'è bisogno di un successo nelle prestazioni dall'ordinamento. Basta tenerli in ordine mentre vai.

+0

il problema è che ho alcuni piani che dovrebbero essere resi incrociati con gli altri. Come se fossero 3d spade piatte. Potrei chiederti, come hai trovato quella domanda così a lungo dopo che è stata fatta e come sono arrivati ​​4 upvoters? – MaiaVictor

+0

Le vostre domande intestano il comportamento delle persone che non possono rispondere :) Tuttavia, se si dispone di poligoni che si incrociano l'un l'altro, non v'è alcuna facile soluzione corretta diverso da quelli per-frammento come K-buffer o l'algoritmo originale A-Buffer, a meno che specificamente polizia le intersezioni del triangolo e le tesselano al volo. – bjorke

17

Diciamo che si sta utilizzando qualche immagine trasparente * .png. Allora questo aiuterebbe:

new THREE.MeshBasicMaterial({ side:THREE.BackSide,map:texture, depthWrite: false, depthTest: false }); 
+0

Per qualche motivo la parte 'side: THREE.BackSide' ha impedito alle mie immagini di renderizzare tutto insieme. Ma a parte questo, il resto ha funzionato alla grande! –

+3

Probabilmente si desidera utilizzare THREE.DoubleSide in modo che sia visibile da entrambi i lati. – Blaise

+0

In realtà funziona davvero bene! – polyclick

12

L'impostazione della proprietà depthWrite al false risolto il mio problema.

new THREE.MeshBasicMaterial({ 
    opacity: 0.25, 
    transparent: true, 
    side: THREE.DoubleSide, 
    depthWrite: false 
}); 
+0

GRAZIE. Niente più "problemi alla scatola nera trasparente"! – Andy