Войти
Подсказки

Использование нескольких (больше 8-ми) источников света.

Автор:

При реализации освещения встаёт вопрос, как реализовать освещение от нескольких источников света. В шейдерах последних версий есть так называемый flow control, то есть циклы, переходы и т.д. Это упрощает дело — поставил все источники в константы, указал их число в другой константе — можно в цикле их все и обработать.

Решение без производительных шейдеров.

Но речь не о новых шейдерах, а о старых, где ни циклов, ничего другого. Здесь можно пойти другим путём. Необходимо отрисовывать объект несколько раз подряд для разных источников света. При этом важно, чтобы значения цвета, полученные от шейдера, суммировались, а не затирали старые. В этом поможет блендинг. Ведь все знают, как можно с его помощью (альфаблендинга) отрисовывать прозрачные поверхности. Но тут необходимо использовать чуть другие параметры. Во-первых, необходимо установить источником цвета исходной и конечной поверхностей их истинное значение цвета, потом задать для блендинга функцию сложения и наконец отключить альфатест. Для примера в DirectX это реализуется так:

pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); //Именно ONE, а не SRCCOLOR
pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); 
//На всякий случай - это значение стоит по умолчанию
pDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD );
pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);

Далее можно вызвать включение блендинга:

pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);

и рисовать. Но с учётом нескольких ньюансов. Отрисовывать надо пообъектно, для каждого перебирать источники света, действующие на него, и отрисовывать несколько раз по очереди, как для одного источника. Ещё важно, что для первого источника света блендинг надо выключить, чтобы затереть пиксели, не относящиеся к данной модели, а для последующих проходов включать, чтобы накапливать значения цвета.

Вот, собственно, и всё.

7 ноября 2005