Shadow Mapping и Transparent Quads

10

Shadow Mapping использует буфер глубины, чтобы вычислить, где тени должны быть нарисованы.

Моя проблема в том, что я хотел бы, чтобы некоторые полупрозрачные текстурированные квадраты отбрасывали тени - например, деревья с биллбордами. Поскольку значение глубины будет установлено для всех четырехугольников, а не только для видимых частей, оно будет отбрасывать тень четырехугольника, а это не то, чего я хочу.

Как я могу сделать так, чтобы мои прозрачные квадраты отбрасывали правильные тени, используя сопоставление теней?

CiscoIPPhone
источник

Ответы:

15

Ваша проблема решит рендеринг с 1-битной альфа. Это означает, что вы указываете некоторую альфу исходной текстуры, которая не отображается (в основном 0,5).

Вы должны написать свой собственный шейдер для сохранения глубины от света и использовать инструкцию discard. Discard существует также в hlsl, glsl и в cg. Он существует только в пиксельном / фрагментном шейдере и отбрасывает текущий фрагмент из рендеринга в backBuffer и в z-буфер.

if (texSample.a < 0.5)
   discard;

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

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

редактировать: я только что понял, что я забыл добавить кредиты. Как всегда. Древовидная модель взята из петлевого проекта, который просто великолепен, если вы ищете низкополигональную, одну текстуру и бесплатные модели растительности.

NotaBene
источник
6

С программируемым конвейером вы должны делать это в соответствии с инструкциями @notabene. Однако это легко сделать и с фиксированным конвейером без написания шейдеров. В OpenGL glAlphaFunc - это то, что вы хотите. Например:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);
msell
источник
1
Ухоженная. Я ненавижу фиксированный трубопровод. Поэтому я действительно восхищаюсь всеми, кто может делать это без шейдеров. +1 точно.
Notabene
@Notabene Нет ничего примечательного в использовании устаревшей технологии.
Тара
2

Вам нужен собственный шейдер для генерации карты теней, чтобы вы могли вывести действительный окклюдер, когда прозрачность пикселя / фрагмента превышает заданный вами порог. Таким образом, карта глубины будет генерироваться для каждого пикселя, а не для многоугольника.

r2d2rigo
источник
-1

Единственный способ сделать это - создать отдельную текстуру карты глубины, отобразить в ней деревья, вывести их на глубину, где alpha! = 0, в противном случае вывести глубину = 1, а затем объединить эту текстуру карты теней с текстурой карты теней сцены. , который должен быть достаточно простым; просто возьмите наименьшее из двух значений и установите его в окончательную карту глубины.

Это не решает смешивание заказов, хотя; если вы выводите глубину за альфа-текстурой, она будет переопределена при рендеринге четырехугольника с текстурой на нем, поэтому для того, чтобы этот эффект работал, вам придется визуализировать каждый квад по отдельности в текстуру карты глубины ...

МЕДС
источник