// Выводим любые сообщения об ошибках if(errorBuffer) { ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0); d3d::Release<ID3DXBuffer*>(errorBuffer); }
if(FAILED(hr)) { ::MessageBox(0, "D3DXCreateEffectFromFile() - FAILED", 0, 0); return false; }
// // Сохраняем дескрипторы часто используемых параметров //
WorldMatrixHandle = LightTexEffect->GetParameterByName(0, "WorldMatrix"); ViewMatrixHandle = LightTexEffect->GetParameterByName(0, "ViewMatrix"); ProjMatrixHandle = LightTexEffect->GetParameterByName(0, "ProjMatrix"); TexHandle = LightTexEffect->GetParameterByName(0, "Tex"); LightTexTechHandle = LightTexEffect->GetTechniqueByName("LightAndTexture");
// // Устанавливаем параметры эффекта //
// Матрицы D3DXMATRIX W, P;
D3DXMatrixIdentity(&W); LightTexEffect->SetMatrix(WorldMatrixHandle, &W);
D3DXMatrixPerspectiveFovLH( &P, D3DX_PI * 0.25f, // 45 градусов (float)Width / (float)Height, 1.0f, 1000.0f);
LightTexEffect->SetMatrix(ProjMatrixHandle, &P);
// Текстура IDirect3DTexture9* tex = 0; D3DXCreateTextureFromFile(Device, "Terrain_3x_diffcol.jpg", &tex);
LightTexEffect->SetTexture(TexHandle, tex);
d3d::Release<IDirect3DTexture9*>(tex);
return true; }
Функция Display прямолинейна и выполняет действия, описанные в разделе 19.6:
bool Display(float timeDelta) { if(Device) { // // ...[Пропущено обновление камеры] //
// Устанавливаем обновленную матрицу вида LightTexEffect->SetMatrix(ViewMatrixHandle, &V);
// // Активируем технику и выполняем визуализацию //
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene();
// Устанавливаем используемую технику LightTexEffect->SetTechnique(LightTexTechHandle);
UINT numPasses = 0; LightTexEffect->Begin(&numPasses, 0);
for(int i = 0; i < numPasses; i++) { LightTexEffect->Pass(i);
for(int j = 0; j < Mtrls.size(); j++) { Mesh->DrawSubset(j); } } LightTexEffect->End();
Device->EndScene(); Device->Present(0, 0, 0, 0); } return true; }