forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Веселые секреты (http://forum.boolean.name/showthread.php?t=152)

Diplomat 30.09.2005 17:46

Вложений: 2
Доброе время суток всем желающим написать на Блице Варкрафт-4!
So, не растекаясь мыслию по древу, сразу к примеру. :)

В прикрепленном архиве два .ББ файла: "1" и "2" соответственно, запустив которые можно посмотреть демку террана с лесом и летающей сверху камерой. Всё почти как в стратегиях, только нет орков и камера управляется клавишами управления курсора.
Файл "1" демонстрирует "принципиально простой", иначе- "классический"- метод реализации этого-самого леса.
Файл "2" демонстрирует "принципиально правильный" метод.
Понять чем они отличаются просто: первый у меня выдает 70ФПС когда в кадре нет вообще ничего и 40- когда в кадре много деревьев. Кроме того, он может просто заглючить на некоторых машинах (глюк Блица с террайнами) и исправить это будет невозможно. Никак.
Второй выдает соответсвенно 3000 и 150 ФПС, никогда не заглючит и если убрать деревья, станет видно, что террайн освещается заметно красивее. Недостатка два: тоннельный эффект на деревьях и долгая генерация террайна.

P.S. 2Новички: Комментов в примерах необходимый минимум. Однако, не смотря на внешнюю навороченность, даже во втором примере код предельно прост и требует лишь внимательного прочтения. Обратите внимание на алгоритмы соединения мешей, рендер-твининга и генерации террайна. Удачи! :ok:

Diplomat 01.10.2005 20:03

Что, так плохо, что ни у кого даже ругательных комментариев не возникло?
Как демка-то? Показатели ФПС как, меняются от способа оптимизации?
Шо ж вы так пассивно? :)

SubZer0 01.10.2005 20:18

в первом примере все работает довольно нормально ФПС у меня 40 даже если ничего в экране нет, а если на гору заберешься, чтоб много деревьев в экране было, то до 20 опускается...

второй пример работает принципиально быстрей, только глючит неимоверно, типа кадры прокрутятся быстро, а потом машина ждет до конца секунды... и так каждую секунду... и ФПС прыгает с 50 до 30 (причем прыгает по 5 раз в секунду).

:)

jimon 01.10.2005 20:18

чет терейн тормозной... :))

МА-ЛА-ДЕЦ ;)

вообщем а чембы ненаписать функцию гемора... ой... generate :) типа ланджафта ?
ну чтобы типа... типа генерить типа ланджафт из типа типа... короче картинки типа под типа названием в типа карта типа высот... :lol:

ps. злостный пост но БЕЗ ОФФТОПА Я НАПИСАЛ! :rolleyes:

alcosholik 01.10.2005 20:45

Во втором исходнике при медленном поворачивании камеры деревья, которые находятся рядом, "мелькают": как будто верхушка одного дерева вдруг оказывается скрыта другим деревом, хотя последнее находится дальше.
Но я не исключаю, что это все из-за моих тупых дров для видяхи.

Diplomat 01.10.2005 21:24

Цитата:

второй пример работает принципиально быстрей, только глючит неимоверно
Хм, так быть не должно. Не должно...
Знаешь, попробуй может вот какие варианты:
1. уменьшить количество деревьев в два раза (в обоих примерах для чистоты эксперимента): Если компьютер не очень крутой, то при ФПС<10-20 твиннинг и таймер обновления камеры будут глючить;
2. убрать вообще задержку "Delay 20" в модуле обновления камеры (тоже в обоих примерах);
3. снести к чертям рендер-твининг во втором примере (убрать CaptureWorld() и поставить просто "RenderWorld()" вместо RenderWorld(Twining/100))
Если всё это не поможет- значит или код косой, или железо... :SOS:

Цитата:

вообщем а чембы ненаписать функцию гемора...
:)) Что, прям чтоб и хейтмапы сам генерил? А генератор колормапов уже есть.

Цитата:

как будто верхушка одного дерева вдруг оказывается скрыта другим деревом, хотя последнее находится дальше.
Не, это не у тебя. Это классический ДиректХ-овский тоннельный эффект. Если использовать на деревьях маск-текстуры вместо текстур с альфаканалом- он исчезнет. Просто модельек деревьев других не было. :)

axel186 02.10.2005 00:17

ОГО!!! :blink: ПРИКОЛЬНО!!! ОСОБЕНО ТУМАН МЕЖДУ ДЕРЕВЬЯМИ ПОНРАВИЛСЯ!!
Жалько только что у меня комп тупой, подвисает всё

jimon 02.10.2005 15:09

а у меня скорость держится такая как указал дипломат

хотя процесор в несколько раз тормознее :lol:
глюков ненайдено - видяха XFX 6600GT , дрова 77.72

Жека 03.10.2005 20:26

Интересный примерчик.

Дома у меня оба примера работали одинаково медленно - около 20 кадров.
Это на Celeron 433, 224 Mb ОЗУ, GF2MX200 64 Mb

На более крутом компе -AMD Sempron 2600+, 512 Mb ОЗУ, RADEON9550 128 Mb- 2 пример быстрее:
в 1ом примере: 40 кадров ВСЕГДА - странно... так не должно быть по-мойму...
во 2ом: 80-110 кадров, если камера смотрит только на поле, и больше 1000, если в пустоту.

Во втором примере при движении или повороте текстура земли размазывается (рябь какая-то), после остановки нормальной становится. Деревья тоже "мелькают"...

ПС: я не понял, зачем нужен флаг 256 для текстуры детализации.
Пробовал убрать флаг вообще - рябь исчезает, но и вид немного другой...

Diplomat 03.10.2005 23:15

Ну, на слабых компах 20ФПС выводится по той простой, что счетчик ФПС возвращает данные 10 раз в секунду, округляя точность 10 да еще и завышает на 10ФПС... Зачем? Раньше юзал для техданных- потом забыл исправить. :)
Корректно получать данные о ФПС можно заменив его код на следующий:
Код:

;FPS counter
FPS=FPS+1
If mFPS<MilliSecs() Then
        mFPS=MilliSecs()+1000
        MaxFPS=FPS
        FPS=0
EndIf

А неизвестный флаг "256" значит, что у тебя неновая версия то ли Блица, то ли хелпов. И артефакты изображения могут быть связаны миенно с этим. ;)
Эта фича по определению- "складирует текстуру в видеопамять". А по сути- она выключает мипмаппинг (размытие) текстур, что очень важно при изображении детайлмаппов на террайнах итп... Ну, 20% ФПС жреть... :)

pax 06.10.2005 10:44

На моей машине (Celeron D 2400 / GF MX400 64MB / 512MB Dual) FPS примерно 20(на горе)-40(просто на карте) во втором примере.

Если установить режим цвета в 16 бит то FPS вырастает до 35-55 соответственно.

Без твининга FPS вырастает на 5-10 к/с, но зато дергается камера (надо написать функцию обработки камеры)

А в общем примерчик неплохой :)

pax 06.10.2005 10:52

Кстати при флаге 256 (Store texture in vram) выключается мипмеппинг текстур, а следовательно и их сглаживание. В этом режиме (256) у меня пример 2 работает чуть медленнее.

pax 06.10.2005 20:47

Вложений: 2
Цитата:

вообщем а чембы ненаписать функцию гемора... ой... generate типа ланджафта ?
ну чтобы типа... типа генерить типа ланджафт из типа типа... короче картинки типа под типа названием в типа карта типа высот...

Вот повозился немного сегодня и сделал процедурку генерации террейна:
Код:

Function GenerateTerrain%(SizeX#,SizeZ#,MaxHeight#,HeightMapFile$,Detail,VertexColorsMap$="")
;#Region Собственно генератор террейна
        Local StepX#=SizeX#/Float#(Detail)
        Local StepZ#=SizeZ#/Float#(Detail)
        Local Mesh%=CreateMesh()
        Local Surface%=CreateSurface(Mesh)
        Local X#,Z#,H#,K#=3*255
        Local I#,J#

        Local HeightImage%=LoadImage(HeightMapFile$)
        ResizeImage(HeightImage%,Detail+1,Detail+1);Это проще чем изобретать алготитм сглаживания поверхности
       
;Расположение вертексов
        SetBuffer ImageBuffer(HeightImage%)
        For I=0 To Detail
 X=-SizeX#/2+I*StepX#
 For J=0 To Detail
        GetColor(I,J)
        H#=(ColorRed()+ColorGreen()+ColorBlue())/K ;H = 0 .. 1
        Z=SizeZ#/2-J*StepZ#
        AddVertex(Surface,X,MaxHeight#*H,Z,I/Float#(Detail),J/Float#(Detail))
 Next
        Next
        SetBuffer BackBuffer()
        FreeImage(HeightImage%)
       
;Создание поверхности
        For I=0 To Detail-1
 For J=0 To Detail-1
        AddTriangle (Surface%,I+(Detail+1)*J,I+(Detail+1)*(J+1),I+1+(Detail+1)*(J+1))
        AddTriangle (Surface%,I+(Detail+1)*J,I+1+(Detail+1)*(J+1),I+1+(Detail+1)*J)
 Next
        Next
;#End Region

;#Region Раскрашивание вертексов
        If VertexColorsMap$<>"" Then
 Local ColorImage%
 EntityFX Mesh%,2;Использование режима 'use vertex colors instead of brush color'
 ColorImage%=LoadImage(VertexColorsMap$)
 ResizeImage(ColorImage%,Detail+1,Detail+1);Это чтобы упростить нахождение цвета вертекса
 SetBuffer ImageBuffer(ColorImage%)
 For I=0 To Detail
        For J=0 To Detail
  GetColor(I,J)
  VertexColor(Surface%,J+(Detail+1)*I,ColorRed(),ColorGreen(),ColorBlue())
        Next
 Next
 SetBuffer BackBuffer()
 FreeImage(ColorImage%)
        EndIf
        UpdateNormals(Mesh%)
        Return Mesh%
;#End Region       
End Function

Вот и все. :)

А это измененный код примера...

pax 06.10.2005 22:55

Цитата:

вообщем а чембы ненаписать функцию гемора... ой... generate типа ланджафт


Не забываем писать закрывающие теги ;)

pax 06.10.2005 23:13

Просто соединение с инетом через мабильник и часто глючит, по этому сообщение не полностью дошло!:'((

Diplomat 07.10.2005 00:00

2 РАХ:
Очень симпатичный пример. :super:
И если о пользе введения повртексной генерации ландшафта можно было бы еще в принципе спорить, то вертексколоры вместо текстуры рулят очевидно и без вопросов. Респект адназначна. :bravo:

Заметка: стиль проганья классный, академичен до предела. Например, используешь "Local"(!) при обьявлении переменных в теле ф-и(!!), пишешь идентификаторы типа переменной "%"(!!), да еще и используешь их повторно... Где учился? /не покажусь нахальным?/ :ok:

pax 07.10.2005 00:07

Я самоучка :), просто много примеров переглядел за долгое время пока пишу игру:)

Правда незнаю когда допишу (Bombers3D).

Да и спасибо за приятный ответ. :@

jimon 07.10.2005 14:13

diplomat
у нас всех такой код
может новички пишут по другому
но тот кто прогает больше года приходит к такому стилю примерно

только не говори что ты скромный и пушистый :))

pax 08.10.2005 19:17

Я игрой (Bombers3D) занялся серьезно только этим летом, хотя задумал написать ее еще полтора года назад когда у меня Blitz появился :)

А пока вот усовершенствованная функция-генератор террейна:
Код:

Function GenerateTerrain%(SizeX#,SizeZ#,MaxHeight#,HeightMapFile$,DetailX%=0,DetailZ%=0,VertexColorsMap$="")
;#Region Собственно генератор террейна
        Local HeightMapImage%=LoadImage(HeightMapFile$)
        DetailX%=Abs(DetailX%): DetailZ%=Abs(DetailZ%)
;Автоматический выбор детализации используя HeightMap
        If DetailX%=0 Then
 DetailX%=ImageWidth(HeightMapImage%)
        EndIf
        If DetailZ%=0 Then
 DetailZ%=ImageHeight(HeightMapImage%)
        EndIf
;Это чтобы упростить нахождение высоты вертекса        при несоответствии HeightMap'a
;указанной детализации
        If DetailX%<>ImageWidth(HeightMapImage%) Or DetailZ%<>ImageHeight(HeightMapImage%) Then
 ResizeImage(HeightMapImage%,DetailX,DetailZ)       
        EndIf
       
        Local StepX#=SizeX#/Float#(DetailX-1)
        Local StepZ#=SizeZ#/Float#(DetailZ-1)
        Local Mesh%=CreateMesh()
        Local Surface%=CreateSurface(Mesh)
        Local X#,Z#,H#,K#=3*255
        Local I#,J#
       
;Расположение вертексов
        SetBuffer ImageBuffer(HeightMapImage%)
        For I=0 To DetailZ-1
 Z=SizeZ#*0.5-I*StepZ#
 For J=0 To DetailX-1
        GetColor(J,I)
        H#=(ColorRed()+ColorGreen()+ColorBlue())/K ;H = 0 .. 1
        X=-SizeX#*0.5+J*StepX#
        AddVertex(Surface,X,MaxHeight#*H#,Z,J/Float#(DetailX-1),I/Float#(DetailZ-1))
 Next
        Next
        SetBuffer BackBuffer()
        FreeImage(HeightMapImage%)
       
;Создание поверхности
        For I=0 To DetailZ-2
 For J=0 To DetailX-2
        AddTriangle (Surface%,DetailX*I+J, DetailX*I+J+1, J+1+DetailX*(I+1))
        AddTriangle (Surface%,DetailX*I+J, J+1+DetailX*(I+1), J+DetailX*(I+1))
 Next
        Next
;#End Region

;#Region Раскрашивание вертексов
        If VertexColorsMap$<>"" Then
 Local ColorImage%
 EntityFX Mesh%,2;Использование режима 'use vertex colors instead of brush color'
 ColorImage%=LoadImage(VertexColorsMap$)
        ;Изменение размера ColorMap при несовпадении с детализацией
 If DetailX%<>ImageWidth(ColorImage%) Or DetailZ%<>ImageHeight(ColorImage%) Then
        ResizeImage(ColorImage%,DetailX,DetailZ);Это чтобы упростить нахождение цвета вертекса       
 EndIf
 SetBuffer ImageBuffer(ColorImage%)
 For I=0 To DetailZ-1
        For J=0 To DetailX-1
  GetColor(J,I)
  VertexColor(Surface%,DetailX*I+J,ColorRed(),ColorGreen(),ColorBlue())
        Next
 Next
 SetBuffer BackBuffer()
 FreeImage(ColorImage%)
        EndIf
;#End Region
        UpdateNormals(Mesh%)
        Return Mesh%       
End Function

Решил что так будет универсальнее...

ABTOMAT 15.06.2007 20:58

Re: Веселые секреты
 
А если вот уж прям приспичило делать с альфлй - как от туннельного эффекта избавиться?

HolyDel 16.06.2007 01:11

Re: Веселые секреты
 
сортировать сюрфейс, немало либ для етих целей сделано.

piro 05.07.2007 14:53

Re: Веселые секреты
 
Люди, у меня первый прпимер выдаёт 70-80,а второй.... 450-500. Так что огромное пасибо дипломату.

HolyDel 07.07.2007 00:14

Re: Веселые секреты
 
я вот думаю каким макаром он может выдавать больше 50 фпс, если там стоит иммитация игровой логики в 20 мс?
Дипломату огромный респект за красиво отрендеренные местности, надо ету технику прихватизировать.

ABTOMAT 12.12.2010 21:33

Ответ: Веселые секреты
 
Ух ты ж, сколько лет прошло!
Я эту тему за неделю второй раз ищу, а она, оказывается "Весёлые секреты" называется! Случайно забрёл сегодня.
Люди! Называйте темы так, чтоб название отражало её суть!
И, кстати, пример из первого поста актуален по сей день. Кто из блицеров не видел - советую ознакомиться.

Nex 13.12.2010 10:15

Ответ: Веселые секреты
 
А как так "симпатично" раскрашивать ландшафт? Наложением текстуры у меня так не получалось..

ARA 13.12.2010 10:33

Ответ: Веселые секреты
 
Вероятно автор клал на нолевой слой карту цвета(растянутую на весь терайн), а на первый слой детайл текстуру с Мультиплай 2)

ABTOMAT 26.04.2013 02:01

Ответ: Веселые секреты
 
Если у кого-то остался аттач из первого поста, выложите, пожалуйста.

mauNgerS 26.04.2013 04:04

Ответ: Веселые секреты
 
Вложений: 1
Вот.

LLI.T.A.L.K.E.R. 26.04.2013 22:31

Ответ: Веселые секреты
 
Кратко, в чём суть (способ эффекта)?
AddMesh?

А ну да, имеются поклетчатые mesh-и (сетки 8х8 ), к которым addmesh близкие деревья.

Пробовал как то ещё с >1000 текстурированными ящиками.b3d позиции x=0 to 100 а y=rand(-3,3)
Так вот при AddMesh хоть ты видишь один уголочек меша - он программно весь рисуется. А если отдельными все Entity - то они авто-Hide-тся.
Так что по разному случаи бывают...

H@NON 27.04.2013 14:55

Ответ: Веселые секреты
 
Вложений: 1
Вот делал что-то подобное. Тут локация разбивается по сетке на сектора куда уже добавляется меш. Также есть возможность в дальнейшем обращаться к этому мешу(который уже добавился в сектор), позиционировать его, поворачивать, с текстурами на моделях проблем вроде не должно быть. Забирайте кому нужно.


Часовой пояс GMT +4, время: 22:56.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot