forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=28)
-   -   Туториал по "Devil Shadow System" (http://forum.boolean.name/showthread.php?t=18252)

KCEPOKC 10.06.2013 20:54

Туториал по "Devil Shadow System"
 
Вложений: 1
Всем привет! Я, хоть и начинающий форумчанин, хочу блеснуть своим остроумием и написать свой первый тутор по сие прекрасной либе от Devil’а:D
Так как это мой первый тутор, прошу "не судить строго" и все в таком роде:)
И вообще, лучше в этой теме совсем не писать:)

В общем начнем. А начнем мы с теории. Я думаю, все знают, что такое «Тень» и что такое «Shadow», про них я говорить не буду.

Первое, что нужно знать – что из себя представляет данная либа. Напомню Вам, что Blitz3D не Unreal Engine 3, поэтому о графике выше Half-Life 2 можно забыть. А для того, чтобы держать графоун на уровне Halfы Вам понадовятся либы. Много либ. «Devil Shadow System» – одна из них. Она поможет Вам сделать крутые реалтайм тени, реалистичную воду, зеркала, лужицы и т.д.

Один из главных недостатков – она жутко теряет производительность и стабильность при высоких нагрузках. Поэтому полигонами и крутыми текстурами «50000 на 50000 пикселав» спамить категорически запрещается. Масштабами тоже.

Второе – хотя бы основы BlitzBasic и какой-никакой опыт работы с ним. Это самое важное, иначе Вы не поймете ни строчки предложенного кода.

Ознакомиться с мускулатурой либы позволят исходники из основной папки.


Ладно, все с теорией. Теперь нужно установить либу.
DLL и Decl файлы из папки «Userlibs» кидаем в аналогичную папку в директории Blitz3D. Все, что из «Includes», понадобится нам при самой разработке. Кидаем все три файла в папку будущего проекта.

Ниже сразу же вторая часть:)

KCEPOKC 10.06.2013 20:59

Основы основ
 
Между первой и второй перерывчик небольшой, да-да-да? :D
А теперь продолжим. Во 2-ой части тутора я познакомлю Вас с самыми что ни на есть основами данной либы. А именно я Вам разберу первый туториал из одноименной папки.
А разберу я Вам его построчно.
Код:

Include "..\Includes\DevilShadowSystem.bb"
Include "..\Includes\ShadowVolumes.bb"
Include "..\Includes\UserInterface.bb"

Тут мы вызываем все нужные инклюды для проекта.
Код:

Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

Известное клише. Разъяснять не вижу смысла.
Код:

Cam = CreateCamera()
PositionEntity Cam, 0, 3, -8

Создаем и ставим камеру.
Код:

InitShadows(Cam)
А вот это уже интересно. Тут мы включаем тени на камеру.
Предупреждение: не рекомендуется включать тени более чем на одну камеру.
Код:

Light = CreateLight()
PositionEntity Light, 10, 10, 0
PointEntity Light, CreatePivot()

Первые две строчки: создаем и ставим на позицию свет.
Извините за «нубство» - я не понял, зачем наводить лайт на пустую точку.
Код:

SetShadowLight(Light)
Вот тут мы включаем тени для данного источника света.
Код:

c = CreateCube()
ScaleEntity c, 5, 1, 5
EntityColor c, 0, 0, 255

Делаем пол из куба. Масштабируем его, затем красим.
Код:

SetShadowMesh(c, False)
Это уже посложнее. Вот краткое объяснение в стиле родного справочника B3D:
SetShadowMesh([Entity], [True or False])
Включаем тени для данного [Entity].

True – разрешаем отбрасывать тень(по умолчанию).
False – запрещаем отбрасывать тень.

Код:

Caster = CreateSphere()
PositionEntity Caster, 3, 3, 0
EntityColor Caster, 255, 0, 0

Делаем сферку по имени «ролик» . Ставим «ролик», затем красим «ролик».
Код:

SetShadowMesh(Caster)
Аналогичная команда, что и для пола. Только без да-нет.
Теперь цикл:
Код:

While Not KeyHit(1)
        TurnEntity Caster, 1, .5, 1.5
       
        Render(1)

        Flip
Wend

Первая строчка: вращаем «ролик».
Для второй строчки у меня справочное объяснение:
Render([0-2], [anim_speed#])
Некая замена клише рендер-апдейт ворлд
Параметры:
0 – стандартный B3D рендер.
1 – рендер с тенями.
2 – дебаг рендер(Для адвенсед юзерс:D)
[anim_speed#] – заменяет аналогичный в UpdateWorld.
Ни в коем случае не использовать UpdateWorld и RenderWorld!

А флип он и есть флип.
Уффф… Последние две строчки:
Код:

FreeShadows()
End

Первой мы удаляем тени, а второй заканчиваем часть тутора.
Надеюсь, Вам понравилось:D

Arton 10.06.2013 21:01

Ответ: Туториал по "Devil Shadow System"
 
Юзал когда-то, ашадов лучше, ИМХО.

KCEPOKC 10.06.2013 21:05

Словарик начинающего
 
И снова здравствуйте! Из за того, что несколько следующих обучающих исходников особо не отличаются от первого, я решил составить так называемый словарь с командами.

Код:

Render([0-2], [anim_speed#])
Некая замена клише рендер-апдейт ворлд
Параметры:
0 – стандартный B3D рендер.
1 – рендер с тенями.
2 – дебаг рендер(Для адвенсед юзерс:D)
[anim_speed#] – заменяет аналогичный в UpdateWorld.
Не в коем случае не использовать UpdateWorld и RenderWorld!


Код:

SetShadowMesh([Entity], [True or False],[ cache$])
Включаем тени для данного [Entity].
True – разрешаем отбрасывать тень(по умолчанию).
False – запрещаем отбрасывать тень.
Также есть возможность кэшировать тени в файл [ cache$]. Это нужно для того, чтобы ускорить следующие запуски программы. Рекомендуется использовать формат .shw


Код:

InitShadows([Cam])
Включение теней на камеру [cam]
Предупреждение: не рекомендуется включать тени более чем на одну камеру.


Код:

FreeShadows()
Очистить мир от теней.


Код:

CreateShadowSphere([True])
CreateShadowCylinder([True])
CreateShadowCone([True])
CreateShadowCube([True])
CreateShadowPlane([True])

Примитивы со сразу включенными тенями.
True – включить отбрасывание теней(по умолчанию)
False – отключить отбрасывание теней
Примечание: лучше использовать классические команды и только затем включать на них тени.


Код:

LoadShadowMesh([Mesh],[True])
LoadAnimShadowMesh([Mesh], [True])

Загрузить [Mesh] сразу со включенными тенями
True – включить отбрасывание теней(по умолчанию)
False – отключить отбрасывание теней
Примечание: лучше использовать классические команды и только затем включать на них тени.


А пока все. Позже я расскажу про бампмаппинг :)

KCEPOKC 10.10.2013 17:36

Ответ: Туториал по "Devil Shadow System"
 
Вложений: 1
Вообщем да. Сидел я себе да пёк, да вдруг вспомнил, что тутор то я не дописал. Вот теперь то да, дописал.

Код:

Как жи эта, карту висот рисовать!
Итак, начнем. В первую очередь я хочу вам сказать, мои дорогие немногочисленные читатели, что бампмаппинг тут хз как сделан, а точнее тут только environmental bump mapping(зеркала, вода, зеркальные поверхности:crazy: ) , но сама суть присутствует - это все же позволяет нам уменьшить кол-во полигонов. Приступим к делу.

Чтобы привязать бампу к мешу, нам нужно начеркать нехитрый код.

Код:

SetENBMMesh(entity, tex, bump, bump_frame = 0)
где "Entity" - наш подопытный меш, "Tex" - к.-л. текстура, "Bump" - бамп мапа. Также есть "Bump_Frame" - ограничивает кол-во кадров бампы, само собой необязательно, и мне вообще данный параметр не пригодился.

Теперь код.

Разберем пример "Tutorial4 - ENBM.bb"

Весь я его затрагивать не буду, да и не надо, я так думаю. Смотрим самое важное.

Код:

Include "SampleFunctions.bb"

InitGraphics()

;Camera
PositionEntity Cam, 4, 5, 4
PointEntity Cam, CreatePivot()

;Shadows
SetENBMHeight(1)

;Sky
c = CreateShadowSphere(5, False)
ScaleEntity c, -1000, -1000, -1000
EntityTexture c, LoadTexture("Media\Island\Skybox.jpg", 385)
EntityFX c, 9

;Light
Light = CreateShadowLight()
PositionEntity Light, 5, 5, 0
PointEntity Light, CreatePivot()

;Floor
floor_bump = LoadTexture("Media\Rock_Bump.jpg")
ScaleTexture floor_bump, 20, 20
c = CreateWater(floor_bump, 100)
ScaleEntity c, .2, 1, .2
floor_tex = LoadTexture("Media\Rock.jpg")
ScaleTexture floor_tex, 20, 20
EntityTexture c, floor_tex, 0, 3

;Columns
tex = LoadTexture("Media\Wood.jpg")
ScaleTexture tex, 1.5, .5
s = 2
For x = -s To s Step 2
        For z = -s To s Step 2
                If Abs(x) = s Or Abs(z) = s Then
                        c = CreateShadowCylinder(16, False)
                        ScaleEntity c, .5, 1.5, .5
                        PositionEntity c, x * 3, 1.5, z * 3
                        EntityTexture c, tex
                EndIf
        Next
Next

;Beethovens
CubeTex = LoadTexture("Media\Cubemap.png", 128)
t1 = LoadTexture("Media\WoodPanel.jpg")
t2 = LoadTexture("Media\WoodPanel_Bump.jpg")
cnt = -1
Dim Beethoven(3)
For x = -1 To 1 Step 2
        For z = - 1 To 1 Step 2
                cnt = cnt + 1
                c = LoadShadowMesh("Media\Beethoven.b3d", False)
                ScaleEntity c, .25, .25, .25
                PositionEntity c, x * 3, 3, z * 3
                EntityTexture c, t1, 0, 3
                SetENBMMesh(c, CubeTex, t2)
                Beethoven(cnt) = c
        Next
Next

;Guy
Global Guy = LoadShadowMesh("Media\Hellknight.b3d", False)
ScaleEntity Guy, .03, .03, .03
PositionEntity Guy, 0, 3.2, 0
EntityTexture Guy, LoadTexture("Media\Hellknight.jpg"), 0, 3
SetENBMMesh(Guy, CubeTex, LoadTexture("Media\Hellknight_Bump.jpg"))

;Ball
c = CreateShadowSphere(16, False)
ScaleEntity c, 2.5, 1.25, 2.5
t1 = LoadTexture("Media\Metal.jpg")
ScaleTexture t1, .25, .25
t2 = LoadTexture("Media\Metal_Bump.jpg")
ScaleTexture t2, .25, .25
EntityTexture c, t1, 0, 3
SetENBMMesh(c, CubeTex, t2)

StartProgram(True)
While Not KeyHit(1)
        UpdateWater()
        UpdateProgram(Cam, .1)
Wend
FreeShadows()
End

Function UpdateSample()
frame = frame + 1
For i = 0 To 3
        RotateEntity Beethoven(i), frame * .1, frame * .1, frame * .1
Next
TurnEntity Guy, 0, .1, 0
End Function

А именно вот эти строчки:
Код:

;Ball
c = CreateShadowSphere(16, False)
ScaleEntity c, 2.5, 1.25, 2.5
t1 = LoadTexture("Media\Metal.jpg")
ScaleTexture t1, .25, .25
t2 = LoadTexture("Media\Metal_Bump.jpg")
ScaleTexture t2, .25, .25
EntityTexture c, t1, 0, 3
SetENBMMesh(c, CubeTex, t2)

Начну с конца, там интересней.
Командой "SetENBMMesh(c, CubeTex, t2)" мы говорим библиотеке привязать к сфере "c" бампмаппу "CubeTex", причем сфера у нас будет иметь стандартную текстуру "t2". Ясно? Наверное да.

Далее стоило бы поговорить про эти строчки:
Код:

floor_bump = LoadTexture("Media\Rock_Bump.jpg")
ScaleTexture floor_bump, 20, 20
c = CreateWater(floor_bump, 100)
ScaleEntity c, .2, 1, .2
floor_tex = LoadTexture("Media\Rock.jpg")
ScaleTexture floor_tex, 20, 20
EntityTexture c, floor_tex, 0, 3

Тут еще интересней. Появилась некая команда "CreateWater()"
Вот она вкратце:

Код:

CreateWater(bumpmap, size = 100, round = False)
bumpmap - бампмапа воды
size - размер плоскости воды
round - если принимает значение "Правда", то создается округлая плоскость, вместо квадратной
Этой командой мы создаем плоскость просто с бампмапой и зеркалом, что само собой подразумевает воду. Для достижения большего эффекта текстуру можно постоянно двигать. Получается прикольно

Далее необходимо в цикле добавить команду "UpdateWater()". Команда неинтересная, про нее говорить не буду.

Ну и все, вернемся к коду:

Код:

floor_bump = LoadTexture("Media\Rock_Bump.jpg")
ScaleTexture floor_bump, 20, 20
c = CreateWater(floor_bump, 100)
ScaleEntity c, .2, 1, .2
floor_tex = LoadTexture("Media\Rock.jpg")
ScaleTexture floor_tex, 20, 20
EntityTexture c, floor_tex, 0, 3

В данном случае вода используется несколько не по назначению, чисто для прикольного зеркала.

Здесь мы командой "c = CreateWater(floor_bump, 100)" говорим блитцу, что нам надобно создать квадратную "воду" по имени "c" с размером 100, причем имеющую бампмапу по имени "floor_bump".

Ну вроде все. В планах - переведенный хелп. Удачи вам в познании блитца, господа!

Таки да, узнал я зачем же свет на пустую точку наводить - без этого теней вы не увидите!

moka 11.10.2013 00:15

Ответ: Туториал по "Devil Shadow System"
 
Дык а скрин с тенями можно?

Arton 11.10.2013 05:10

Ответ: Туториал по "Devil Shadow System"
 
Цитата:

Сообщение от moka (Сообщение 268601)
Дык а скрин с тенями можно?

Такие же как в ашадове - юзается dx7.dll


KCEPOKC 11.10.2013 15:01

Ответ: Туториал по "Devil Shadow System"
 
Цитата:

Сообщение от moka (Сообщение 268601)
Дык а скрин с тенями можно?

Оки Доки

KCEPOKC 11.10.2013 15:28

Ответ: Туториал по "Devil Shadow System"
 
Вложений: 2
Решил запилить примерчик. Вот держите. Модель танчика и все текстуры скачаны. Приятного просмотра

Управление:
w-вперед
a-влево
s-назад
d-вправо
Мышка - поворот

Код в комплекте. Бампмаппинг не юзал, да и смысла не вижу.
Я надеюсь, либа уже установлена:user:

KCEPOKC 11.10.2013 16:22

Ответ: Туториал по "Devil Shadow System"
 
Вложений: 1
Перевел хелп. Наконец. Было трудно, но я сделал это.
На этом мое повествование почти закончилось - осталось только написать свой пример с ENBM. Ждемс.

KCEPOKC 17.10.2013 16:31

ENBM
 
Вложений: 2
Вот и все. Наконец я доделал тутор.
Пример с Бамп Маппингом. Все сурово, немного рябит в глазах, но главное смысл отражает: ОНО РАБОТАИТ!
Извините, код не прокомментирован. Делал в в попыхах.
Впрочем там все ясно.
Затем, я так думаю, напишу тутор по ашадову, затем сравню его с девилом в отдельной теме.:-)

moka 17.10.2013 16:53

Ответ: Туториал по "Devil Shadow System"
 
Честно сказать - молодец за труды. Но если ты ожидаешь что это кому-то понадобиться, зря надеешься.
Вот на шейдерах чегонить - понадобиться кому-то, даже не столько сам код, сколько вдохновление и т.п.
Я заметил что много кого шейдеры прикалывают, и друг-дружку вдохновляют.
Вон на гд.ру есть темка с шейдерами, народ выкладывает картинки, и всем приятно, вдохновляет.. А вот ковыряя и так мёртвый труп - доставит только олдфагам.

Arton 17.10.2013 17:04

Ответ: ENBM
 
Цитата:

Сообщение от XoreX (Сообщение 268966)
Вот и все. Наконец я доделал тутор.
Пример с Бамп Маппингом. Все сурово, немного рябит в глазах, но главное смысл отражает: ОНО РАБОТАИТ!
Извините, код не прокомментирован. Делал в в попыхах.
Впрочем там все ясно.
Затем, я так думаю, напишу тутор по ашадову, затем сравню его с девилом в отдельной теме.:-)

Скриншот ты не сделал =/


Бампмапинг извините, говняный:




На чистом блице всё намного симпатичнее:




P. S. Жду когда изучишь ашадов и сравнишь библиотеки.
P. P. S. По краям сферы борьба полигонов.

KCEPOKC 17.10.2013 20:25

Ответ: ENBM
 
Цитата:

Сообщение от Arton (Сообщение 268972)
P. P. S. По краям сферы борьба полигонов.

Борьба полигонов происходит при разрешении выше 1024 на 768. Сам охреневаю.
А так то да, бампмаппинг там хреново реализован. Честно. Так что ашадов меня ждет:)

p.s. Извиняйте за скрин. Ща будет!

Arton 17.10.2013 20:50

Ответ: ENBM
 
Цитата:

Сообщение от XoreX (Сообщение 268991)
Борьба полигонов происходит при разрешении выше 1024 на 768. Сам охреневаю.
А так то да, бампмаппинг там хреново реализован. Честно. Так что ашадов меня ждет:)

p.s. Извиняйте за скрин. Ща будет!

Про разрешение грустно, смысл тогда использовать :(

С ашадовым такая тем, на старой версии библиотеки работали все примеры. Однако же как только автор пофиксил либу для висты и выше (до этого тени работали только на XP), начались проблемы, прежние примеры некорректно работают, например: нету мягких теней (хотя может это я не нашёл), прежние примеры бампмапинга перестали работать, есть бамп но нету тени и т. п.
Понять в чём дело мне так и не удалось :(


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

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