Тіньова карта та прозорі квадратики


10

Тіньове відображення використовує буфер глибини для обчислення того, де слід малювати тіні.

Моя проблема полягає в тому, що я хотів би, щоб напівпрозорі фактурні квадроцикли викидали тіні - наприклад, дерева, розміщені на щитах. Оскільки значення глибини буде встановлено по всьому квадратику, а не лише у видимих ​​частинах, воно буде кидати тінь квадратика, а це не те, що я хочу.

Як я можу змусити мої прозорі квадратики відтворювати правильні тіні за допомогою тіньового відображення?

Відповіді:


15

Ваша проблема вирішить візуалізацію за допомогою 1-бітної альфа. Це означає, що ви вказали деяку альфа тексту тексту, яка не відображається (переважно 0,5).

Вам потрібно написати власний шейдер для економії глибини від світла та використання інструкції discard. Відмова існує також у hlsl, glsl та cg. Він існує лише в шейдері пікселів / фрагментів і відкидає фрагмент виправлення від візуалізації в backBuffer і в z-буфер.

if (texSample.a < 0.5)
   discard;

Перевагою є те, що вам не потрібно змінювати свою передачу 2-го проходу, а лише відображення глибини світла. Також я довів, що це працює: 1-бітна альфа

Якщо ви хочете зробити правильні тіні для декількох прозорих об'єктів, вам доведеться використовувати безліч текстур глибини, з інформацією про глибину та непрозорість, що надається за допомогою глибинного пілінгу. А для диму, волосся тощо. Глибокі непрозорість або карти непрозорості Фур'є - найкраще рішення (я в основному рекомендую карти непрозорості Фур'є)

редагувати: Я щойно зрозумів, що забув додати кредити. Як завжди. Модель дерева - від проекту loopix, який просто чудовий, якщо ви шукаєте якийсь низький рівень, одну текстуру та вільні моделі рослинності.


6

З програмованим конвеєром ви повинні це зробити так, як наказав @notabene. Однак це легко зробити і з фіксованим трубопроводом, не створюючи шейдерів. У OpenGL glAlphaFunc - це те, що ви хочете. Наприклад:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

1
Акуратний. Я ненавиджу нерухомий трубопровід. Тож я дуже захоплююся всім, хто може робити це без шейдерів. +1 точно.
Нотабене

@Notabene Немає нічого захоплюючого у використанні застарілої технології.
Тара

2

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


-1

Єдиний спосіб, коли я можу це зробити, - це створити окрему текстуру карти глибини, передати дерева в неї, вивести на глибину, де альфа! = 0, інакше вивести глибину = 1, потім поєднати цю текстуру тіньової карти з текстурою тіні карти сцени , який повинен бути досить простим; просто візьміть найменше з двох значень і встановіть його на остаточну карту глибини.

Це не вирішує замовлення на змішування; якщо ви виведете глибину за альфа-текстурою, вона буде переосмислена, коли ви виведете квадратик з текстурою на ньому, тож для цього ефекту вам доведеться перетворювати кожен квадратик окремо в текстуру карти глибини ...

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