Программирование графики с использованием Direct3D



Функция ShadowWin::CreateScene() - часть 2


/p>

Функция CreateScene() выполняет следующие десять действий:

  • Создание сетки, представляющей платформу или пол.
  • Создание текстуры для сетки пола.
  • Создание и применение наложения текстуры для сетки пола.
  • Размещение сетки пола и ее фрейма.
  • Создание сетки вилки.
  • Размещение сетки вилки и ее фрейма.
  • Создание источника рассеянного света.
  • Создание точечного источника света.
  • Создание тени.
  • Создание порта просмотра.
  • Давайте начнем изучение кода с шага 1, создания сетки пола:

    D3DRMLOADRESOURCE resinfo; resinfo.hModule = NULL; resinfo.lpName = MAKEINTRESOURCE(IDR_CUBEMESH); resinfo.lpType = "MESH"; d3drm->CreateMeshBuilder(&floorbuilder); floorbuilder->Load(&resinfo, NULL, D3DRMLOAD_FROMRESOURCE, NULL, NULL); floorbuilder->Scale(D3DVALUE(5), D3DVALUE(.05), D3DVALUE(5)); floorbuilder->SetPerspective(TRUE); floorbuilder->SetQuality(D3DRMRENDER_FLAT);

    Для представления пола используется сетка кубической формы. Она загружается с помощью функции Load() интерфейса Direct3DRMMeshBuilder, а затем делается плоской с помощью функции Scale(). Для сетки разрешается перспективная коррекция и устанавливается плоский метод визуализации.

    На следующем этапе осуществляется загрузка текстуры, которая будет наложена на сетку пола:

    LPDIRECT3DRMTEXTURE texture; HRSRC texture_id = FindResource(NULL, MAKEINTRESOURCE(IDR_FLOORTEXTURE), "TEXTURE"); d3drm->LoadTextureFromResource(texture_id, &texture); floorbuilder->SetTexture(texture); texture->Release(); texture = 0;

    Значение, идентифицирующее текстуру, получается с помощью функции FindResource(), входящей в Win32 API. Затем текстура загружается с помощью функции LoadTextureFromResource() и связывается с созданным ранее конструктором сеток с помощью функции SetTexture(). После выполнения этих действий указатель texture освобождается.

    На третьем этапе происходит создание и применение наложения текстуры для сетки пола:

    D3DRMBOX box; floorbuilder->GetBox(&box); D3DVALUE w = box.max.x - box.min.x; D3DVALUE h = box.max.z - box.min.z;




    Содержание  Назад  Вперед