Нужно сцену смотреть.
Куча лайтов с пересекающейся зоной влияния - много овердро.
Куча отдельных маленьких - должно норм пахать.
А, Ну дак у тебя на каждый лайт фулскрин квад рисуется!
Надо кваду ограничивать зону влияния, иначе тут в любом случае жутчайший овердро.
Известные способы (не мешающие друг другу):
1. Рисовать не фулскрин квад, а квад поменьше, в который вписывается зона влияния лайта. Часто лайты не влияют на весь экран.
2. Рисовать грубый меш по форме зоны влияния лайта (лоуполи сферу для поинта, конус для спота). Рисовать его только в стенсил (не в глубину, не в цвет). Юзать настройки стенсила, как со стенсильными тенями в Depth Fail методе (2 раза не надо только волум рисовать, есть хардварный two-sided stencil):
http://en.wikipedia.org/wiki/Shadow_volume
Это даст тебе помеченные в стенсиле пиксели, куда влияет лайт (где он пересекается со сценой). Дальше рисуешь экранный квад, но настраиваешь стенсил так, чтобы он проявлялся только в помеченых волумом местах. Стенсил тест идёт до выполнения шейдеров.
Это точнее, чем вариант 1, который не учитывает пересечение с збуфером, но вариант 1 тоже не помешает, чтобы сократить число пикселей квада, тестящих стенсил.
---
По мелочам из кода:
vertexShaderPassOne->GetConstantTable()->SetMatrix( g_device, v1View, &view );
vertexShaderPassOne->GetConstantTable()->SetMatrix( g_device, v1Proj, &proj );
vertexShaderPassOne->GetConstantTable()->SetMatrix( g_device, v1World, &world );
|
pixelShaderPassTwo->GetConstantTable()->SetFloatArray( g_device, p2LightPos, temp, 3 );
pixelShaderPassTwo->GetConstantTable()->SetFloat( g_device, p2LightRange, light->radius );
|
- многовато лишних действий. много за 1 вызов заливать все матрицы и за 1 все параметры лайта:
SetVertexShaderConstantF
SetPixelShaderConstantF
необязательно по имени брать константы из шейдера, можно замаппить их напрямую в нужные регистры типа
const float4x4 MatWorldViewProj : register(c0);
const float4x4 MatWorld : register(c4);
с# - номера констант, они измеряются в float4, это нативный формат видюшной константы (на самом деле флоаты и флоаты2/3, это все равно неполные флоаты4 или их части).
Но если у тебя там не тысячи объектов, это всё мелочи - просто так удобнее, быстрее, контроллируемее, имхо.