Использование нескольких (больше 8-ми) источников света.
Автор: Hitrolisk
При реализации освещения встаёт вопрос, как реализовать освещение от нескольких источников света. В шейдерах последних версий есть так называемый 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