Як зробити текстуру частково прозорою?


13

Доброго ранку StackOverflow, у мене зараз є певна проблема, оскільки я не можу знайти спосіб прозоро відобразити частину текстури з openGL.

Ось моя настройка: у мене є чотиримісний, що представляє стіну, покриту цією текстурою (перетворений на PNG для завантаження). Очевидно, я хочу, щоб стіна була непрозорою, за винятком стекол. За стіною є ще одна площина, яка повинна показувати пейзаж. Я хочу побачити краєвид з-за вікна. Кожна текстура - це TGA з альфа-каналом.

Спочатку виводиться "пейзаж", потім стіна. Я думав, що цього буде достатньо для досягнення цього ефекту, але, мабуть, це не так. Частина вікна, яка повинна бути прозорою, чорна, а пейзаж з’являється лише тоді, коли я проїжджаю повз стіни.

Я спробував поспілкуватися з GLBlendFunc () після його ввімкнення, але, здається, це не вийшло.

Я забуваю важливий крок?

Дякую :)


Привіт, ласкаво просимо до gdse. Я мало змінив редагування, нам не подобається розміщувати теги в питаннях із заголовком. (Особливо коли ви теги використовуєте в тегах :)). І до вашого питання. Використовуєте ви фіксований трубопровід чи власні шейдери?
Нотабене

Дякую за редагування Я не впевнений у значенні "фіксованого трубопроводу", але я будую кожну вершину вручну, і не використовую жодного шейдера. Якщо це має значення, я не використовую останню версію openGL, оскільки це для шкільного призначення (я думаю, це openGL 3).
megamoustache

Було б чудово, якби ви могли включити малюнок у своє запитання. Здається, він зник із свого початкового місця.
АБО Mapper

Відповіді:


19

Крім усього, що ви заявили (текстури з альфа-каналами, малювання пейзажу перед малюванням стіни + вікна), вам також потрібно зробити ще дві речі.

По-перше, вам потрібно включити функцію змішування OpenGL:

glEnable(GL_BLEND);

По-друге, вам потрібно сказати OpenGL, як обчислити кольори змішаних пікселів (які, між іншим, OpenGL називає "фрагментами"). У цьому випадку вам буде добре з таким простим:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Після включення суміші OpenGL поєднує кольори пікселів відповідно до параметрів функції, які ви надаєте в glBlendFunc. Зокрема, це буде робити "source.color * source.alpha + target.color * (1-source.alpha)", де "source" - це текстура, яку ви зараз рендеруєте, а "призначення" - це колір, який вже є framebuffer (пейзаж). Отже, де б ваш альфа-канал був білим, ви отримаєте колір стіни, і де б альфа-канал був чорним, ви отримаєте пейзажний колір. Якщо альфа-канал сірий, то ви отримаєте перекреслене між двома кольорами.

Якщо ваше вікно повністю прозоре, то є й інші способи зробити це, де порядок, в якому ви малюєте два багатокутники, не важливий, але він починає вникати в більш досконалі поняття, такі як пороги альфа. Напевно, не потрібна для вашої поточної ситуації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.