2012-06-22 4 views

ответ

10

Это не ошибка, это то, как работает OpenGL (и, следовательно, WebGL). Прозрачные поверхности плохо воспроизводятся с z-буфером и поэтому должны быть вручную отсортированы и отображены в обратном порядке. Три JS пытаются сделать это за вас (поэтому проблема уходит, когда вы устанавливаете значение X> 0), но не можете надежно обрабатывать случай пересекающейся геометрии, как вы показываете.

Я объяснил проблему более подробно в different SO question, поэтому вы можете обратиться к ней.

+1

Благодарим за ответ, но так вы говорите мне, что лучше просто перепроектировать мою игру или это решение, подходящее для взлома Three.JS? – MaiaVictor

+1

@ Тоджи, на который вы ссылаетесь, не касается точно такой же проблемы. В другом вопросе это только часть объекта/текстуры, которая прозрачна, где в этом вопросе вся плоскость прозрачна, и это легко разрешимо, просто деактивируя «depthWrit» полностью для прозрачной плоскости. – Wilt

15

Попробуйте добавить alphaTest: 0.5 к материалу.

+0

Пробовал, что не работал:/Я думаю, что это проблема webgl, поэтому мне нужно перепроектировать, как в моей игре отображаются самолеты. Хотя это будет немного взломанным. – MaiaVictor

+1

У меня есть плоскость с текстурой на холсте, отображаемой на ней, отображающей текст. При определенных углах/позициях у меня возникали проблемы с прозрачностью материала текстуры, и это фиксировало его, поэтому спасибо! – plyawn

+3

Примечание: 'alphaTest' - это перехват, который сделает полупрозрачные области в текстурах либо полностью непрозрачными (когда непрозрачность пикселей), либо полностью прозрачна (при непрозрачности пикселей Blaise

6

fwiw, если у вас много параллельных плоскостей (вы не можете увидеть ваш образец, Google не может разрешить ваш домен), их легко сортировать по перпендикулярной оси. Для списка плоскостей [A B C D] порядок для рисования будет либо [A B C D], либо [D C B A], и больше ничего! Таким образом, не требуется удар производительности при сортировке. Просто держите их в порядке, когда идете.

+0

проблема в том, что у меня есть несколько самолетов, которые должны быть переданы другим. Как если бы они были 3d плоскими мечами. Могу я спросить, как вы нашли этот вопрос так долго после того, как его спросили, и как сюда пришли 4 спасателя? – MaiaVictor

+0

Ваши вопросы приспосабливаются к поведению людей Я не могу ответить :) Однако, если у вас есть многоугольники, которые пересекают друг друга, нет простого правильного решения, отличного от фрагментарных фрагментов, таких как K-Buffers или оригинальный алгоритм A-Buffer, если вы специально не контролируете пересечения треугольников и тесселировать их на лету. – bjorke

17

Предположим, что вы используете прозрачное изображение * .png. Тогда это помогло бы:

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

По какой-то причине часть 'side: THREE.BackSide' остановила мои изображения от рендеринга все вместе. Но, кроме этого, все остальное отлично поработало! –

+3

Возможно, вы захотите использовать THREE.DoubleSide, чтобы он был видимым с обеих сторон. – Blaise

+0

Это действительно работает очень хорошо! – polyclick

12

Установка depthWrite свойства false решить мою проблему.

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

СПАСИБО. Больше нет «прозрачной проблемы с черным ящиком»! – Andy