15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

1. Рендеринг поверхности

От Автора: Этот проект я начал давно, я нашёл программу, работающую с поверхностями, написанную на C (Автор: Nicholas Anderson его страничка). Я переделал его программку в Pascal, и начал писать свою программу рендеринга поверхностей на Delphi. Самый интересный момент - это способ, которым смешиваются различные текстуры земли, используя 'alpha maps'.

amap1.gif (19136 bytes)

In the left image I highlighted in red the quads between two different land textures, quads that are textured using alpha maps (like the one on the right) to create a new texture. When the program starts, the heightfield data is analysed and all these small 'transition' textures are created and stored. Observe that only the central part of a transition texture is used - that is to avoid the edge of the texture to become visible because of the bilinear filtering.

The heightfields used are generated with the excellent 'Wilbur' editor written by J.R. Slayton, or real scanned DEMs available on the Web edited with the same program, or generated with Nicholas Anderson's built-in random fractal terrain generation algorithm.
Вот несколько картинок для иллюстрации.

ter_falaise_t.jpg (10892 bytes)

ter_volcano_t.jpg (9303 bytes)

66 fps на моей TNT2 & Celeron 464 MHz

Вулкан (отредактирован в Wilbur)

ter_mt_t.jpg (10345 bytes)

ter_canyon_t.jpg (8508 bytes)

A Wilbur generated ridged multifractal

Реальный каньон Colorado!

The heightfields used are 256x256 matrices of small integers (-32758..32767), yet the heights should be scaled between -100..100 or so. (Could have used shortints).
Процедура создания поверхности в Wilbur:
1. Создаём новую поверхность, 256x256.
2. Затем идём в  Surface -> Calculate height field,  там можно выбрать параметры по вкусу;
3. Edit the terrain with Wilbur's tools to create interesting shapes; не забудьте нажать 'Relight'.
4. Идём в Surface -> Point process -> Scale, Scale type= To range, and scale your terrain to Highest=80 and Lowest=-30 or according to your terrain. Note that 0 is the sea level.
5. File -> Save as.., save as 'Lon/Lat text mesh', Output bounds - set to pixel, an 0 (zero) decimal places.
6. Start 'Terrain_Del' and press F4, and load the previously saved .txt height data. You can save the terrain as binary by pressing F2.

This program is not optimized for speed.  Yet the 65 frames per second on my TNT2 & Celeron 464 is not bad.  
Не знаю почему, но на карточке Intel i740 программа выдаёт ошибку 'Division by zero'.   На ATI rage PRO's работает медленно и не показывается туман.
> I got some feedback (thanks Assen) that says it crashes on S3 Savage. :(
> Hopefully the new improved version of this prog will be finished this summer..

Скачать EXE-шник, с картами
Скачать исходник на Delphi (без комментариев, извините)

*NOTE* The above links don't seem to work if you use DownloadAccelerator(tm).


2. Пример использования

  • Solar light&material example

    This is a spinning textured spheres (planets!) example with constant frame-rate.
    You can change the light and material parameters and see results in realtime.
    Click on the image and drag to rotate the scene. The first time you do it it works fine, like a trackball,
    but subsequent drags will not act like you would expect.. Because the axes of rotation are also rotated
    So I should use quaternions, or Euler angles, or matrices to store the scene's rotation.


    Скачать пример с исходниками

    - Продолжение следует! -