d3drm
Придется делать многократный рендер в текстуру.
1. Создаешь ЗАРАНЕЕ текстуру с отрендеренной тенью от статичной геометрии.
2. Сортируешь подвижные объекты по удалению от источника света.
3. Делаешь копию теневой текстуры в рендер-таржет.
4. Устанавливаешь счетчик подвижных объектов (N) в 1.
5. Рендеришь N-ный объект в бэкбуфер, используя рендер-таржет текстуру.
6. Рендеришь N-ный объект в рендер-таржет текстуру, используя черный материал.
7. N=N+1: If N<=MaxObjCount THEN GoTo 5
Из-за постоянного переключения рендер-таржет такая схема годится только для малого кол-ва подвижных объектов. Можно рендерить объекты в текстуру сразу все, но тогда они не будут затенять друг друга - только архитектуру.
Возможна оптимизация, например рендерить объекты в текстуру пачками, заранее вычисляя те, которые друг друга не затеняют.
GLEB
Текстуру, которая уже отрендерена невидимой - видимой не сделаешь. Используй мультитекстурирование. Никаких на небольшом расстоянии плоскостей не нужно. На первой стадии рендеришь текстуру самой стены, ярко, не затеняя. На второй накладываешь тень.
Это упрощенный вариант, когда заранее рассчитаны текстуры тени, даже не нужен второй проход.
- Код: Выделить всё
d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE