создание стекла

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

Модератор: Mikle

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

создание стекла

Сообщение lellel » 30.05.2008 (Пт) 11:42

Здравствуйте!
пытался создать стекло, получилось в принципе сносно, но хочется узнать, может можно сделать лучше? то есть наверянка можно..
сначала просто отрисовал полупрозрачную плоскость.. чего то не хватает.. ага, отражения!
так, поюзав книгу Mikle сумел сделать отражения из текстуры.. текстуру получил сделав скриншот.. немного повозился со стадиями отрисовки, ну получилось в принципе то что хотелось, полупрозрачная плоскость, с отражающейся стенкой которая находится сзади.. текстуру отражений перевернул..
но наблюдаются искажения геометрии отражения, когда смотрю под большим углом.. моя текстура отражений как бы снята обычным 50mm объективом, а не широкоугольным "фишаем".. а можно сделать так, чтобы отражалось окружающее пространство?
а как по-другому сделать имитацию стекла?

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

Сообщение Ktulhu » 30.05.2008 (Пт) 15:33

можно переделать текстуру отражения следующим образом: поставить камеру на место стекла, установить fov 3.1 например, запринтскринеть получившийся ужосс. потом в фотожопе применить фильтр distort->polar coodrs.
я так пару раз делал - было похоже на правду)
а если хочется отражения от стекла с обеих сторон, то можно использовать cube mapping

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

Сообщение lellel » 30.05.2008 (Пт) 18:26

Не понял. Что значит "установить fov 3.1"?
Да. Отражения с обеих сторон хочется! Что такое cube mapping?
Я конечно поюзаю поиск, просто сейчас с телефона-неудобно.

добавлнено позднее:
fov это насколько я понял углы обзора камеры.. попробовал то что ты советовал с фильтром в фотошопе, но получилось не очень...
судя по всему cube mapping это то что мне нужно.. у кого нибудь есть примерчик? на форуме ничего не нашел:(

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

Сообщение Ktulhu » 31.05.2008 (Сб) 17:12

да, fov это угол обзора. 3.1 это типо приближенное к Пи радиан.

ниже какойто пример у себя нашел. кто аффтар не знаю, но, скорее всего, с этого форума
У вас нет доступа для просмотра вложений в этом сообщении.

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

Сообщение lellel » 31.05.2008 (Сб) 23:02

О! то что надо.. завтра посмотрю подробнее.. спасибо!

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

Сообщение lellel » 01.06.2008 (Вс) 16:52

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

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

Сообщение Mikle » 02.06.2008 (Пн) 18:46

lellel
Посмотри пример с водой, стекло - то же, только проще. Очень сильно добавляет реализма зависимость прозрачности от угла зрения.

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

Сообщение lellel » 02.06.2008 (Пн) 21:38

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

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

Сообщение Mikle » 03.06.2008 (Вт) 19:56

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

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

Сообщение lellel » 04.06.2008 (Ср) 21:20

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

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

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

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

Сообщение lellel » 07.06.2008 (Сб) 23:46

Mikle
как мне создать проективную текстуру?
я пробовал вместо куба одну поверхность, но без cubemap все же не знаю как..

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

Сообщение Mikle » 08.06.2008 (Вс) 10:29

lellel
Так же, как в примере с водой. Только матрицу камеры придется рассчитывать чуть сложнее, вода всегда горизонтальна, поэтому я делал просто y=-y, а стекло может быть под любым углом, соответственно нужно отразить и камеру. Зато все остальное проще, анимации нет - значит не нужна VolTex, если стекло гладкое, то не нужен вообще бамп.

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

Сообщение lellel » 08.06.2008 (Вс) 18:42

ну наверное с матричными преобразованиями я как нибудь разберусь,..
у вас в примере для рендера вобы используется 3 текстуры: VolTex, ReflTex, TransTex..
ReflTex очевидно та самая проективная текстура с отражениями, кажется я даже понял как она задается...
а что вы назвали VolTex и TransTex?
(насколько я понял VolTex хранит текстуры, используемые как анимация для воды, будто она(вода) колеблется...)
а что такое бамп?

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

Сообщение Mikle » 09.06.2008 (Пн) 12:19

lellel
VolTex и Bump для гладкого стекла не нужны. Не нужна даже TransTex, это преломления, а в тонком стекле его нет.
То есть сначала рендеришь все непрозрачное, потом, для каждого стекла рендеришь ReflTex в текстуру со своей матрицей, потом отключаешь zWrite и рендеришь все стекла от дальнего к ближнему. Для начала просто можно задать некоторую прозрачность в вертексах или в TextureFactor, когда все заработает - я напишу тебе шейдер, чтобы прозрачность зависела от угла зрения.

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

Сообщение lellel » 09.06.2008 (Пн) 21:32

ага.. вроде все понял.. Спасибо!
как получится/не получится отпишусь;)

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

Сообщение lellel » 20.07.2008 (Вс) 0:29

я тут занимался CubeMapping... у меня происходит нечто странное:
по нажатию кнопки F5 все работает так как задумано, но после компиляции отказывается работать, т.е. ехе-шки вылетают с ошибкой.. даже пример из этой темы не работает если его откомпилить..
причем на этот пример это моя виста выдает ошибку:
"object variable or With block variable not set"
а ноутбук с xp ошибку:
"несовпадение типов"..
опытным путем установил, что не нравится ему метод SetRenderTarget...
что делать??(

добавлено позже

а одна программа работает, но при завершении вылетает с ошибкой..
это в принципе не страшно, но если бы все так работали..

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

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

Сообщение Mikle » 20.07.2008 (Вс) 8:59

lellel
Эту проблему уже обсуждали, похоже, что это кривизна реализации SetRenderTarget в TLB. Но это достаточно просто обойти дополнительным вложением SetRenderTarget... в другую ф-цию, и использованием On Error Resume Next в ф-ции уровнем выше. См. например класс RenderTarget в примере воды с отражениями.

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

Сообщение lellel » 20.07.2008 (Вс) 12:30

спасибо, посмотрю)
но как я уже сказал, все решилось убиранием оптимизации. конечно ехе-шки получаются разные по размеру, по скорости я не смотрел, но вроде сносно работает..

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

Сообщение lellel » 21.07.2008 (Пн) 0:04

а вот еще проблема:
хочу например сделать шарик, зеркальный.. чтобы от него отражалось все окружающее.. использую cubemapping
все нормально, но если я хочу применить такую матрицу к шарику
Код: Выделить всё
 
D3DXMatrixScaling m1, pp1, pp1, pp1
d3dDevice.SetTransform D3DTS_WORLD, m1

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

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

Сообщение Mikle » 21.07.2008 (Пн) 10:33

lellel

d3dDevice.SetTransform D3DTS_WORLD меняет не только координаты вертексов, но и длину нормалей, а нормали должны быть нормализованы. Пора забыть о SetTransform, а работать с вертексным шейдером.

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

Сообщение lellel » 21.07.2008 (Пн) 11:17

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

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 21.07.2008 (Пн) 11:30

lellel писал(а):а вот еще проблема:.

Попробуй нормализировать нормали после масштабирования:
Код: Выделить всё
Device.SetRenderState D3DRS_NORMALIZENORMALS, true

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

Сообщение lellel » 21.07.2008 (Пн) 19:16

о! помогло:) спасибо StimorolD3DX

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

Re: создание стекла

Сообщение lellel » 15.08.2008 (Пт) 16:09

наконец отрисовал стекло, по моему сносно..
(увы то что получилось выложить не могу, ибо все это в проекте с кучей мучора, и надо много отрезать, чтобы все работало без многочисленных текстур.. да и мусора полсно в поректе. этот проект что то типа мастерской)
но вот код главной функции:
Код: Выделить всё
Public Sub ReflRender()
Dim i As Integer
 
  '''
    D3DXMatrixLookAtLH Mtrx1, vec3(5, 2, 5.8), vec3(5 + Sin(CamAngle + Pi) * Cos(CamDiff), 2 + Sin(CamDiff), 5.8 + Cos(CamAngle + Pi) * Cos(CamDiff)), vec3(0, 1, 0)     'матричный поворот, чтобы камера смотрела перпендикулярно зеркалу
    d3dDevice.SetTransform D3DTS_VIEW, Mtrx1

    For i = 0 To Mips - 1   'Mips, это количество MIP уровней у текстуры
        Set CubeC = TexR1.GetSurfaceLevel(i)   'TexR1 это сама текстура, которая будет использоваться как карта отражений
        d3dDevice.SetRenderTarget CubeC, CubeZ, 0   'это некоторые поверхности, нужные для снимка.. взято из примера [b]Mikle[/b]..
        d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &H687090, 1, 0
     
        RenderDop   'это рендер окружающей стекло сцены
    Next i

    d3dDevice.SetRenderTarget MainC, MainZ, 0   'то взято из примера [b]Mikle[/b], если я правильно понял восстановление изначальных поверхностей
    d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &H687090, 1, 0
    D3DXMatrixPerspectiveFovLH Mtrx1, 1, Form3D.ScaleHeight / Form3D.ScaleWidth, 0.1, 100
    SetCamera   'функция, которая устанавливает камеру в положенное для нее место
'''
 
  RenderDop   'это рендер окружающей стекло сцены
 
 
  d3dDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1
  d3dDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
  d3dDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
  d3dDevice.SetRenderState D3DRS_BLENDOP, D3DBLENDOP_ADD
 
  d3dDevice.SetRenderState D3DRS_ZWRITEENABLE, 0
 
 
  d3dDevice.SetRenderState D3DRS_TEXTUREFACTOR, &H11808080
 
  d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1
  d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR
 
  d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_TFACTOR

  'отрисовка самого стекла
  d3dDevice.SetTexture 0, TexR1
  d3dDevice.SetStreamSource 0, vBufPortS, vSizePortS
  d3dDevice.SetVertexShader vFlagPortS
  d3dDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 2
 
  d3dDevice.SetRenderState D3DRS_ZWRITEENABLE, 1

End Sub


кроме того иннициализация, почти полностью как в примере
Код: Выделить всё
Public Sub ReflInit()

Dim Size As Long

Size = 1024
Mips = 2     'глобальная переменная Long

  Set MainC = d3dDevice.GetRenderTarget
  Set MainZ = d3dDevice.GetDepthStencilSurface

  Set CubeZ = d3dDevice.CreateDepthStencilSurface(Size, Size, D3DFMT_D16, D3DMULTISAMPLE_NONE)
 
  Set TexR1 = d3dx.CreateTexture(d3dDevice, Size, Size, Mips, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT)
     
End Sub


ну и обьявление переменных
Код: Выделить всё
Public CubeC As Direct3DSurface8
Public CubeZ As Direct3DSurface8
Public MainC As Direct3DSurface8
Public MainZ As Direct3DSurface8

Public Mtrx1 As D3DMATRIX

Public TexR1 As Direct3DTexture8
Dim Mips As Long


кажется, все:)

но это только для плоского стекла... причем нормалью служит вектор (0,0,1), зеркало находится в точке (5, 2, 5.8)...


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

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

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

    TopList