- •Учебник
- •Оглавление
- •Введение
- •Глава 1
- •I. Установка
- •II. Удаление
- •Глава 2. Первый проект
- •Глава 3. Создание сцены в режиме design time
- •Создание объектов:
- •Глава 4. Примитивные объекты. Вкладка Basic geometry.
- •Глава 5. Ориентация, координаты.
- •Глава 6. Движение.
- •Глава 7. Как узнать, сколько сейчас fps?
- •Глава 8. Полноэкранный режим.
- •Глава 9. Работа с материалами.
- •I. Прямое обращение к .Material
- •Глава 10. Использование 3d моделей.
- •I. Форматы моделей
- •Глава 11. Прокси объекты.
- •Глава 12. Создание земной поверхности с glTerrainRenderer.
- •Глава 13. Создание земной поверхности с glFreeForm.
- •Глава 14. Итоги работы с glTerainrender и glFreeForm.
- •Глава 15. Создание земной поверхности с glHeightField.
- •Глава 15. Создание неба.
- •Глава 16. GlAtmosphere.
- •Глава 17. Спецэффекты.
- •I. Огонь
- •II. Молния
- •III. Дождь
- •IV. Снег
- •VI. Блики от источников света
- •Глава 18. Растительность.
- •I. Деревья и кустарники
- •II. Трава
- •Глава 19. Работа со шрифтами и вывод надписей.
- •I. Вывод текста через компонент glWindowsBitmapFont
- •II. Проблема с glWindowsBitmapFont в Windows Vista
- •Глава 20. Выделение объекта мышкой.
- •Глава 21. Создание сцены в режиме runtime.
- •Глава 22. Тени.
- •Глава 23. Туман.
- •Глава 24. Vbo или расширение arb_vertex_buffer_object в OpenGl.
- •Глава 25. Fbo или расширение ext_framebuffer_object в OpenGl.
- •Глава 26. Рисование на канве.
- •Глава 27. Использование чистого OpenGl.
- •Глава 28. Звуки.
- •I. Проигрывание звуков с помощью bass
- •II. Проигрывание звуков с помощью fmod
- •III. Проигрывание звуков с помощью OpenAl
- •Глава 29. Игровое меню.
- •Глава 30. Примитивная физика dce.
- •Глава 31. Физика ode.
- •II. Основы библиотеки ode(: tglodeManager и tglodeJointList) на примере создания подобия боулинга.
- •Глава 32. Физика Newton.
- •Глава 33. Ручная проверка коллизий.
- •V. Ручная проверка коллизии
- •Глава 34. Шейдеры. Терменология.
- •Глава 35. Шейдеры. История и компоненты.
- •Глава 36. Шейдеры glsl. Введение.
- •Глава 37. Шейдеры glsl. Использование без компонентов. Самый примитивный шейдер.
- •Глава 38. Шейдеры glsl. Немного о спецификации. Типы данных и переменные
- •Стандартные функции
- •Поддерживаемые компоненты векторов
- •Глава 40. Шейдеры glsl. Текстурирование.
- •Глава 41. Шейдеры glsl. Использование без компонентов. Мультитекстурирование. Смешение трёх цветов по базовой карте.
- •Глава 42. Шейдеры glsl. Использование через компонент glslShader. Часть первая – Первые шаги.
- •Глава 43. Шейдеры glsl. Использование через компонент glslShader. Часть вторая – знакомимся со светом. Передача параметров в шейдер.
- •Глава 44. Шейдеры glsl. Использование через компонент glslShader. Часть третья – текстуры.
- •Глава 45. RenderMonkey.
- •Глава 46. Оптимизация программы.
- •Глава 47. Практика. Создание мира
- •Приложение
- •I. Типы векторов и матриц
- •II. Работа с векторами
- •III. Работа с матрицами
- •IV. Методы объектов glScene
- •Предметный указатель по компонентам glScene
Глава 11. Прокси объекты.
Если нужно использовать много одинаковых объектов, то лучше не создавать их все по отдельности, а создать лишь один базовый объект, а для каждой его копии делать proxy. Таким образом, можно значительно повысить FPS. Так же рекомендуется для снижения нагрузки на компьютер использовать для объектов, находящихся далеко от камеры, спрайты. Для ещё большего снижения нагрузки, в добавок к перечисленному, можно использовать шейдеры.
В GLScene присутствуют семь компонентов для создания и использования proxy объектов. Это GLProxyObject, GLColorProxy, GLFreeFormProxy, GLMaterialProxy, GLActorProxy, GLMultiProxy и GLMaterialMultiProxy.
GLProxyObject служит для копирования примитивов.
GLFreeFormProxy служит для копирования FreeForm.
GLActorProxy используется для копирования GLActor. Здесь же стоит отметить, что анимация GLActor повторяется на всех его proxy объектах.
GLMultiProxyObject - более передовая версия прокси объектов. Она имеет большие возможности и использует технологию оптимизации LOD (технология LOD описана в главе 11).
Добавлять прокси объект можно через инспектор объектов сцены или объявлять где-нибудь в программе.
Пример:
var pro:TGLProxyObject;
i:integer;
begin
GLFreeForm1.LoadFromFile('mushroom.3ds');
GLFreeForm1.Scale.Scale(0.2);
GLFreeForm1.Pitch(90);
for i:=1 to 1000 do
begin
pro:=TGLProxyObject.createaschild(GLScene1.Objects);
pro.MasterObject:=GLFreeForm1;
pro.ProxyOptions:=[pooObjects,pooTransformation];
pro.position.x:=0.1*(500-i);
pro.position.z:=-50;
end;
end;
Появится 1000 стоящих в ряд грибов.
Я приведу описание некоторых свойств.
-
Свойство
Описание
MasterObject
В это свойство записывается объект, который нужно скопировать.
ProxyOptions. pooObjects
Положительное значение определяет, что proxy будет копировать структуру мастер-объекта.
ProxyOptions. pooTransformation
Положительное значение определяет, что proxy будет копировать масштаб, положение и ориентацию в пространстве мастер – объекта.
ProxyOptions. pooEffects
Положительное значение определяет, что proxy будет копировать эффекты мастер-объекта.
Не забывайте, что если нужно загружать формат .3ds, то для этого используется не
TGLFreeForm, а TGLFile3DsFreeForm, работа с которым рассказана в девятой главе.
Глава 12. Создание земной поверхности с glTerrainRenderer.
Один из способов создания поверхности земли – это использование задаётся GLTerrainRenderer (GLScene>Scene objects->Add object->Mesh objects->TerrainRenderer). Особенностью GLTerrainRenderer является то, что он поддерживает некоторые техники оптимизации. Такия как ROAM и LOD. Сейчас я о них немного расскажу.
LOD (Levels Of Detail) — это приём в программировании 3D-графики, заключающийся в создании нескольких вариантов одного объекта с различными степенями детализации, которые переключаются в зависимости от расстояния объекта до виртуальной камеры.
Существуют два стратегических подхода к управлению детализацией: статический и динамический LOD. В первом случае заранее создают упрощенные варианты максимально детализированного объекта. Предположим, что для модели танка, состоящей из 1200 полигонов, достаточно сделать упрощенные варианты из 600 и 300 полигонов. В ходе построения сцены просчитывается удаление модели танка от плоскости проецирования и выбирается вариант, соответствующий дальности.
Статическое управление вызывает эффект «дерганья» изображения при смене детализации объекта. Если уровень LOD близок к граничному значению, иногда возникает циклическая смена моделей с разным уровнем детализации. К тому же приходится обсчитывать несколько разных моделей для одного объекта.
Динамическое управление детализацией потребляет значительные вычислительные ресурсы, требует непрерывного пересчета не только координат вершин треугольников, но и параметров освещенности. При частом переключении между уровнями иногда наблюдается эффект «волнистости» поверхности — форма объекта непрерывно «плывет», что в неживой природе выглядит особенно нереально.
ROAM (Real-time Optimally Adapting Meshes). Использует прямоугольный треугольник, который делится на более маленькие треугольники.
I. GLBitmapHDS
Нам понадобится карта высот TGLBitmapHDS из вкладки GLScene Utils на панели инструментов Delphi. Работает это так: в TGLBitmapHDS загружается чёрно-белая картинка, на которой нарисован рельеф. Затем GLTerrainRenderer создаёт землю по этой картинке. TGLBitmapHDS называют картой высот, потому что чем темнее цвет на картинке, тем выше будет холм.
Настраиваем свойства GLTerrainRenderer и TGLBitmapHDS либо в инспекторе объектов, либо программно:
//Максимальный размер карты:
GLBitmapHDS1.MaxPoolSize:=8*1024*1024;
//Загрузка карты высот:
GLBitmapHDS1.Picture.LoadFromFile('имя файла.bmp');
//Свяжем карту высот с Terrain’ом:
GLTerrainRenderer1.HeightDataSource:=GLBitmapHDS1;
//Загрузка текстуры земли: GLTerrainRenderer1.Material.Texture.Image.LoadFromFile('файл текстуры'); GLTerrainRenderer1.Material.Texture.Enabled:=true;
//Повернем Terrain, чтобы земля была горизонтальной:
GLTerrainRenderer1.PitchAngle:= 90;
//Зададим нужный масштаб (третий параметр регулирует высоту холмов):
GLTerrainRenderer1.Scale.SetVector(1,1,0.02);
GLTerrainRenderer рисует ландшафт до бесконечности. Если необходимо ограничить размер карты, поставьте свойство InfiniteWrap объекта GLBitmapHDS в значение False;
II. GLCustomHDS
Код, который накладывает текстуру, содержится в методе StartPreparingData объекта GLCustomHDS. Так вот эта процедура вызывается при инициализации каждого тайла (патча), при этом у тайла есть его координата XLeft / YTop, иначе говоря, цикл обрабатывает все вершины тайла с координатами XLeft / YTop. Из чего, имея некий массив вершин (карту высот) любых размеров, можно отрисовать ее насколько угодно количеств тайлов.
Несуразный пример использования GLCustomHDS можно посмотреть в стандартной папке Demos по адресу Demos\meshes\synthterr