Показать сообщение отдельно
Старый 10.10.2013, 17:36   #5
KCEPOKC
Принтер
 
Аватар для KCEPOKC
 
Регистрация: 21.04.2013
Адрес: Больше не РФ
Сообщений: 569
Написано 342 полезных сообщений
(для 1,242 пользователей)
Ответ: Туториал по "Devil Shadow System"

Вообщем да. Сидел я себе да пёк, да вдруг вспомнил, что тутор то я не дописал. Вот теперь то да, дописал.

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

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

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".

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

Таки да, узнал я зачем же свет на пустую точку наводить - без этого теней вы не увидите!
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 1182
Размер:	163.1 Кб
ID:	19774  
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо KCEPOKC за это полезное сообщение:
ant0N (10.10.2013), SBJoker (10.10.2013)