Реализация тени

Загрузить архив с примерами ЗДЕСЬ.

Описание функции D3DXMatrixShadow приведено ниже, это функция из библиотеки DirectX9. Почитать на сайте MSDN можно по ссылке: D3DXMatrixShadow

shadow shadow shadow shadow shadow

Код примера для паралельного и точеченого источника света можно загрузить /src/02.008-shadow/Solid_Cube1_MatrixShadow.

Так же пример (для проверки) для точечного источника света, использовалась функция DirectX9 D3DXMatrixShadow. Код примера можно загрузить /src/02.008-shadow/Solid_Cube1_MatrixShadow_DX9Shadow.

Более подробно об этом можно почитать в книге Франка Луны Введение в программирование трехмерных игр с DirectX 9.0 за 2003 год.

Матрица тени полный расчет показан ниже, используется 4х компонентный вектор x,y,z,w.

Если используется матрица тени для паралельного источника света, то для lightDirection w компонента должна быть 0, и вектор должен быть нормализован, например так:


D3DXVECTOR4 lightDirection(0.707f, -0.707f, 0.707f, 0.0f);

Если используется матрица тени для точечного источника света, то для lightDirection w компонента должна быть равна 1.0f и вектор должен содержать не нормализованные координаты, например так:


D3DXVECTOR4 lightDirection(100.0f, -100.0f, 0.100f, 1.0f);



	//D3DXVECTOR4 lightDirection(100.0f, -100.0f, 0.100f, 1.0f);
	D3DXVECTOR4 lightDirection(0.707f, -0.707f, 0.707f, 0.0f);
	D3DXVECTOR4 groundPlane(0.0f, -1.0f, 0.0f, 0.0f);
	
	float k = D3DXVec4Dot(&groundPlane, &lightDirection);
	
	D3DXMATRIX S = D3DXMATRIX(
		k - groundPlane.x * lightDirection.x,
		-groundPlane.x * lightDirection.y,
		-groundPlane.x * lightDirection.z,
		-groundPlane.x * lightDirection.w,


		-groundPlane.y * lightDirection.x,
		k - groundPlane.y * lightDirection.y,
		-groundPlane.y * lightDirection.z,
		-groundPlane.y * lightDirection.w,

		-groundPlane.z * lightDirection.x,
		-groundPlane.z * lightDirection.y,
		k - groundPlane.z * lightDirection.z,
		-groundPlane.z * lightDirection.w,

		-groundPlane.w * lightDirection.x,
		-groundPlane.w * lightDirection.y,
		-groundPlane.w * lightDirection.z,
		k - groundPlane.w * lightDirection.w	);


	//D3DXVECTOR4 lightDirection(100.0f, -100.0f, 0.100f, 1.0f);
	D3DXVECTOR4 lightDirection(0.707f, -0.707f, 0.707f, 0.0f);
	D3DXVECTOR4 groundPlane(0.0f, -1.0f, 0.0f, 0.0f);

	float k = -D3DXVec4Dot(&groundPlane, &lightDirection);
	
	S = D3DXMATRIX(
		groundPlane.x * lightDirection.x + k,
		groundPlane.x * lightDirection.y,
		groundPlane.x * lightDirection.z,
		groundPlane.x * lightDirection.w,

		groundPlane.y * lightDirection.x,
		groundPlane.y * lightDirection.y + k,
		groundPlane.y * lightDirection.z,
		groundPlane.y * lightDirection.w,

		groundPlane.z * lightDirection.x,
		groundPlane.z * lightDirection.y,
		groundPlane.z * lightDirection.z + k,
		groundPlane.z * lightDirection.w,

		groundPlane.w * lightDirection.x,
		groundPlane.w * lightDirection.y,
		groundPlane.w * lightDirection.z,
		groundPlane.w * lightDirection.w + k);
	}