Порядок накладення текстур впливає на роботу alpha-каналу

Добрий день. Насправді все так: я генеруючи текстуру з альфа-каналом і накладаю її на всі площини куба. Проблема полягає в тому, що через деякі абсолютно прозорі (alpha channel = 0) області на площинах куба не видно інших інших площин. Методом крутіння куба :) зрозумів, що це залежить від порядку накладення текстур на межі в функції display (). Наприклад, якщо дивитися через останню по порядку накладення текстуру, то крізь неї видно всі інші грані, а якщо дивитися на куб через першу по порядку накладення, то інші грані не видно.

Порядок накладення текстур впливає на роботу alpha-каналу

Порядок накладення текстур впливає на роботу alpha-каналу

Дякую за вашу увагу і допомогу.

Так, справа в тому, що в залежності від порядку відтворення задні грані у Вас відкидаються, тому що не проходять тест глибини, а якби тест глибини був вимкнений, вони малювалися б поверх передніх, що теж не є коректною поведінкою.

У загальному випадку без сортування напівпрозорих граней по глибині не обійтися. Спочатку потрібно малювати найдальші, потім самі ближні. З включеним тестом глибини і Блендінг, зрозуміло. Є ще один просунутий спосіб - Depth peeling. Якщо нічого не плутаю, це коли сцену малюють цілком (Не сортуючи трикутники як такі), але кілька разів з різними площинами відсікання по глибині, потім пошарово відображають. Якість залежить від кількості проходів.

Для куба і інших опуклих напівпрозорих багатогранників я б порадив Вам наступний підхід:

  1. Включити відсікання задніх граней (glEnable (GL_CULL_FACE). Якщо у Вас OpenGL).
  2. Намалювати тільки задні грані (спочатку - glCullFace (GL_FRONT). Потім - RenderCube).
  3. Намалювати тільки передні грані (спочатку - glCullFace (GL_BACK). Потім знову RenderCube).

відповідь дан 23 Серпня '12 о 14:47

До речі, якщо у Вас немає напівпрозорих граней, а альфа-канал дискретно стрибає від 0 до 1.0f, як на наведеному Вами прикладі, прекрасно спрацює і просто включення Alpha test (в OpenGL це виглядає так: glEnable (GL_ALPHA_TEST); glAlphaFunc (GL_GEQUAL, 0.5); - це означає, що при значенні альфи в текстурі від 0 до 0.5 нічого малюватися не буде, в при 0.5-1.0 - вималюється.) Блендінг як такої в цьому випадку навіть не потрібний. - allcreater 27 Серпня '12 в 8:07