Введение в программирование трехмерных игр с DX9

       

Затенение ландшафта



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; } }



Содержание раздела