блюр

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

блюр

Сообщение lellel » 20.12.2007 (Чт) 12:55

осваиваю D3D. столкнулся с такой проблемой: если камера находится на большом расстоянии от колонны (посреди комнаты колонна-цилиндр с той же текстурой что и на полу) то она неестественно сильно выделяется от пола. текстура пола уже через "несколько метров" фильтруется и линии нечеткие, что в принципе неплохо, толь на этой колонне все не так. все остается четким на большем расстоянии. использовал мип-мэпинг, фильтрацию текстур и анизотропию. хотелось чтобы либо этот столб тоже размывался, либо чтобы пол отрисовывался более четко... это можно осуществить?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 20.12.2007 (Чт) 19:26

lellel
"Чтобы колонна размазывалась" никто не делает. Чтобы пол стал четче нужна анизотропная фильтрация.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 20.12.2007 (Чт) 20:00

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

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 20.12.2007 (Чт) 20:00

вот только при большом отдалении колонна кажется плоской...

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 20.12.2007 (Чт) 21:36

lellel писал(а):вот только при большом отдалении колонна кажется плоской...

Может потому, что света нету...

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 20.12.2007 (Чт) 22:17

я тоже так подумал... я плохо знаком со светом, оч плохо... читая форум много чего не понял, выходит свет проходит препятствия? т е нужно самому контролировать его проходимость? наверное в виртуальной комнате лучше использовать точечьный свет типа лампа, не знаю как это будет выглядеть, сейчас попробую...
какой свет мне лучше использовать?

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 20.12.2007 (Чт) 23:23

как нужно организовать освещение для того же проекта... то есть есть несколько вертексов, у всех текстуры, как задать точечьное освещение? нужно ли формат вертексов поменять? или еще чего... подскажите пожалуйста!

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 20.12.2007 (Чт) 23:24

и еще вот какой вопрос, для одного из вертексов есть второй этап текстурирования и там карта теней... и у меня есть подозрения, что это как то влияет и на вертех с одной текстурой... форматы у них разные... что можно сказать по этому поводу?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 21.12.2007 (Пт) 11:26

Свет работает при включенном материале, в вертексе не должно быть цвета, но должна быть нормаль, в результате из нормали и материала получается Diffuse, потом его можно умножить на Texture, получим освещенный затекстуренный объект, есть еще Ambient, он не зависит от нормали, поэтому не дает эффекта освещения, а дает светимость (рассеянный свет). Все это есть в книге.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 21.12.2007 (Пт) 18:38

ороче сделал так:
в D3DInit добавил
Код: Выделить всё
    d3dDevice.SetRenderState D3DRS_LIGHTING, 1
    d3dDevice.LightEnable 0, 1
    d3dDevice.SetRenderState D3DRS_AMBIENT, &H666666


создал две функции
Код: Выделить всё
Public Sub InitLight()
  Dim Light As D3DLIGHT8
  Light.Type = D3DLIGHT_DIRECTION
  Light.Direction = vec3(10 * Sin(Timer), 10, 10 * Cos(Timer))
  Light.diffuse.r = 1
  Light.diffuse.g = 1
  Light.diffuse.b = 1
  d3dDevice.SetLight 0, Light
End Sub

Public Sub InitMaterial()
Dim Mat As D3DMATERIAL8
  Mat.diffuse.r = 1
  Mat.diffuse.g = 1
  Mat.diffuse.b = 1
  Mat.Ambient = Mat.diffuse
  d3dDevice.SetMaterial Mat
End Sub


вертекс и формат вершин такой
Код: Выделить всё
Private Type vFormat2
  Pos As D3DVECTOR
  Normal As D3DVECTOR
  tu0 As Single
  tv0 As Single
End Type

Private Const vFlag2 = D3DFVF_XYZ Or D3DFVF_NORMAL Or D3DFVF_TEX1


в итоге в комнате только AMBIENT... как мне кажется... нормали задал... в главном цикле по разу запустил InitLight и InitMaterial...
не использовал ни один раз d3dDevice.SetTextureStageState...
хотя даже если написать
Код: Выделить всё
  d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE

ничего не меняется...

кто то может объяснить мне причину этого? почему свет не работает?

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 21.12.2007 (Пт) 18:42

если из функции InitLight убрать строку
Код: Выделить всё
   d3dDevice.SetLight 0, Light

то пол неравномерно освещается (мне показалось что направленным источником) и я никак не могу поменять параметры освещения...

рассмотрел примеры из книги Mikle мне кажется все нормально, но света нет... то есть он не такой каким должен быть...

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 21.12.2007 (Пт) 18:43

если надо могу приложить скрины...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 21.12.2007 (Пт) 19:37

lellel
Не пиши новые посты, в старых есть кнопка "Правка", чтобы дописать мысль.
Ты задал значения нормалей?

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 21.12.2007 (Пт) 20:01

пардон! не скажу что оч много общаюсь на форумах так что не заметил... да задал... все вручную... вот
Код: Выделить всё
Dim VertPot(5) As vFormat2
    vSizePot = Len(VertPot(0))
    Set vBufPot = d3dDevice.CreateVertexBuffer(6 * vSizePot, 0, vFlag2, D3DPOOL_DEFAULT)
  p = 25
  p1 = 25
 
  VertPot(0) = Vertex2(25, 2.99, -25, 0, 0, -25, 1.99, -25)
  VertPot(1) = Vertex2(-25, 2.99, -25, 0, p, -25, 1.99, -25)
  VertPot(2) = Vertex2(25, 2.99, 25, p, 0, 25, 1.99, 25)
 
  VertPot(3) = Vertex2(-25, 2.99, -25, 0, p, -25, 1.99, -25)
  VertPot(4) = Vertex2(25, 2.99, 25, p, 0, 25, 1.99, 25)
  VertPot(5) = Vertex2(-25, 2.99, 25, p, p, -25, 1.99, 25)
  D3DVertexBuffer8SetData vBufPot, 0, 6 * vSizePot, 0, VertPot(0)


Код: Выделить всё
Private Function Vertex2(x As Single, y As Single, z As Single, tu0 As Single, tv0 As Single, normx As Single, normy As Single, normz As Single) As vFormat2
  Vertex2.Pos = vec3(x, y, z)
  Vertex2.tu0 = tu0
  Vertex2.tv0 = tv0
  Vertex2.Normal.x = normx
  Vertex2.Normal.y = normy
  Vertex2.Normal.z = normz
End Function


вывел так
Код: Выделить всё
  d3dDevice.SetStreamSource 0, vBufPot, vSizePot
  d3dDevice.SetVertexShader vFlag2
  d3dDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 2

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 21.12.2007 (Пт) 20:21

lellel
Нормаль, это вектор, указывающий направление перпендикулярное поверхности, желательно чтобы он был единичным, "-25, 1.99, -25" явно неподходит.
А вообще это что, пол? На нем ВСЕ нормали должны быть "0, 1, 0", то есть направлены вверх вдоль оси Y. У круглой колонны наоборот, Y=0, а X и Z равны Sin и Cos от направления от центра колонны к вертексу.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 21.12.2007 (Пт) 20:37

вообще это потолок... я думал этот вектор должен быть единичным вектором перпендикулярно поверхности полигона, причем его X и Z координата совпадают с координатой вертекса... а нормаль это направление вектора относительно вершины или начала координат?

исправил на
Код: Выделить всё
  VertPot(0) = Vertex2(25, 2.99, -25, 0, 0, 0, -1, 0)
  VertPot(1) = Vertex2(-25, 2.99, -25, 0, p, 0, -1, 0)
  VertPot(2) = Vertex2(25, 2.99, 25, p, 0, 0, -1, 0)
 
  VertPot(3) = Vertex2(-25, 2.99, -25, 0, p, 0, -1, 0)
  VertPot(4) = Vertex2(25, 2.99, 25, p, 0, 0, -1, 0)
  VertPot(5) = Vertex2(-25, 2.99, 25, p, p, 0, -1, 0)


учитывая то, что это потолок... у пола задал все нормали как 0,1,0... все равно не работает...((

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

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 21.12.2007 (Пт) 23:00

Нормаль относительно начала координат... она же единичной длины должна быть) Важно только направление.

поппробуй такое дописать перед рендером:
D3DDevice.SetRenderstate D3DRS_NORMALIZENORMALS, True

выложи скрины

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 21.12.2007 (Пт) 23:45

не помогло


вот темная комната где только AMBIENT. если его убрать ничего не видно...

впрочем я уже что то сделал с одним из примеров из той же книги Mikle... вроде работает... сейчас все вертексы туду перетащу и посмотрю...
Последний раз редактировалось lellel 15.02.2009 (Вс) 2:24, всего редактировалось 1 раз.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 22.12.2007 (Сб) 17:03

я конесно понимаю что чуть не в тему, но как создать точечьный источник?
каким параметрам что присвоить?

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 22.12.2007 (Сб) 17:41

точечный шото типо такого:

Код: Выделить всё
Dim Light As D3DLIGHT8
With Light
.Attenuation0 = Attenuation0
.Attenuation1 = Attenuation1
.Attenuation2 = Attenuation2
.Diffuse = Diffuse
.Position = Pos
.Range = Range
.Specular = Diffuse
.Type = D3DLIGHT_POINT
End With


Attenuation влияет на то, как ведет себя интенсивность на расстоянии от источника
Diffuse - цвет
Position - координаты источника в пространстве
Range - радиус действия
Specular - цвет блика

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 22.12.2007 (Сб) 18:21

спасибо Ktulhu!
а можешь подробнее об Attenuation?

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 22.12.2007 (Сб) 18:38

Вот скопировал с мсдна. Думаю, так будет понятно

------------------------------------------------------------------------------
Attenuation

Attenuation controls how a light's intensity decreases toward the maximum distance specified by the range property. Three D3DLIGHT8 structure members represent light attenuation: Attenuation0, Attenuation1, and Attenuation2. These members contain floating-point values ranging from 0.0 through infinity, controlling a light's attenuation. Some applications set the Attenuation1 member to 1.0 and the others to 0.0, resulting in light intensity that changes as 1 / D, where D is the distance from the light source to the vertex. The maximum light intensity is at the source, decreasing to 1 / (Light Range) at the light's range. Typically, an application sets Attenuation0 to 0.0, Attenuation1 to a constant value, and Attenuation2 to 0.0.

You can combine attenuation values to get more complex attenuation effects. Or, you might set them to values outside the normal range to create even stranger attenuation effects. Negative attenuation values, however, are not allowed.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 22.12.2007 (Сб) 19:03

спасибо! все работает, вот только если источник помещаю в угол, все как и должно быть, а если посреди комнаты (в центре) то стены и потолок освещаются неравномерно... стена образована (каждая из четырех) двумя треугольниками, пол и потолок тоже по два треугольника... все задавал вручную, так что уверен что нормали правильно, тем более в углах светит как надо... про расположении источника около стень но посередине ее, это эта стена освещается при высоком Range, а остальные плохо, на стыке получается что одна стена гораздо светлее другой... кажется я где то читал, что это из-за неравномерной плотности вершин... это так?

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 22.12.2007 (Сб) 19:38

да. дело в том, что освещение просчитывается не для каждого пикселя стены, а только для вершины. Т.е. для триугольника просчитывается свет только в трех точках. Чем больше сделаешь вершин, тем реалистичнее будет освещение.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 22.12.2007 (Сб) 19:53

ага! спасибо еще раз! вопрос уже чисто для кругозора: я что то читал кажется про LigthMap или что то такое... это уже поточечьное (попиксельное) освещение?

а как сделать, чтобы этот источник выглядел как лампочка? то есть чтобы "слепил глаза" когда смотришь на него? я думаю понятно объяснил... это сложно? если сложно, то пока пожалуй за это браться не буду, так что в этом случае не обязательно обьяснять... спасибо!

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 22.12.2007 (Сб) 23:02

LightMap - это текстура, в которой хранится карта освещения. Оно, можно сказать, попиксельное, намного быстрее обычного света, но статическое. Удобно применять на статических обьектах и со статическими источниками света. Еще в лайтмапе можно просчитывать и тени, но, опять же, только статические.

Про Particles слышал? В позиции источника рисуешь полупрозрачный квадрат с текстурой. Можно еще, чтоб был эффект слепоты, в зависимости от угла, под которым смотрим на источник, увеличивать/уменьшать размер этого квадрата или еще шото... Обрати внимание, каким образом это сделано в разных играх, и определи, как тебе удобнее.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 22.12.2007 (Сб) 23:50

спасибо... попробую...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 23.12.2007 (Вс) 11:39

Рядом есть тема:
http://bbs.vbstreets.ru/viewtopic.php?t=34240
Там пример со светящимся источником света, вместо полупрозрачного квадрата использован PointSprite.
Так же пример демонстрирует попиксельное освещение без деления больших треугольников на мелкие, но это неполноценный, упрощенный (зато быстрый) вариант, для полов-потолков самое то.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 23.12.2007 (Вс) 15:29

спасибо за пример. вот только под вистой воникает ошибка в строке
:(
Код: Выделить всё
 
Set LTex = d3dx.CreateTexture(d3dDevice, Size, Size, 1&, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT)

можно ли ее под вистой запустить? посто на моем компе виста, правда икспи есть на отцовском ноуте... :( а что в этой строке реализуется?

а под ИксПи в строке ошибку находит
Код: Выделить всё
Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, d3dpp)


но если под икспи ее заменить на
Код: Выделить всё
Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
все работает...

добавлено позднее
я практически ничего не понял в тексте примера. Mikle можете ли краткое пояснение дать? чтобы более или менее понять.. шейдер не нужен...

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 23.12.2007 (Вс) 17:28

1. попробуй так:
Set LTex = d3dx.CreateTexture(d3dDevice, Size, Size, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT)

2. Видяха в отцовском ноуте не поддерживает аппаратную обработку вертексов

След.

Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList