Затенение ландшафта
13.4.3. Затенение ландшафта
Теперь, когда мы узнали как выполнить затенение отдельного квадрата, можно выполнить затенение всех квадратов ландшафта. Мы просто перебираем в цикле все квадраты ландшафта, вычисляем для каждого из них коэффициент затенения и умножаем цвет соответствующего квадрату текселя на полученный коэффициент. В результате квадраты, получающие мало света станут темнее. Ниже приведен фрагмент кода, являющийся главной частью метода Terrain::lightTerrain:
DWORD* imageData = (DWORD*)lockedRect.pBits; for(int i = 0; i < textureDesc.Height; i++) { for(int j = 0; j < textureDesc.Width; j++) { int index = i * lockedRect.Pitch / 4 + j;
// Получаем текущий цвет ячейки D3DXCOLOR c(imageData[index]);
// Затеняем текущую ячейку c *= computeShade(i, j, lightDirection);;
// Сохраняем затененный цвет imageData[index] = (D3DCOLOR)c; } }