Отражения на CubeMap.

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

Модератор: Mikle

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

Отражения на CubeMap.

Сообщение Mikle » 08.07.2006 (Сб) 16:57

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

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 08.07.2006 (Сб) 18:16

Пример классный - а главное просто! Я уже разобрался!
#define ROFL 0xDDDD

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Сообщение DODge » 12.08.2006 (Сб) 2:05

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

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 12.08.2006 (Сб) 3:33

DODge
Самая большая проблема с которой ты столкнёшся - это артефакты на стыках... Я даже не знаю как их убирать... Поэтому интересно посмотреть что же всё-таки выйдет!
#define ROFL 0xDDDD

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Сообщение DODge » 12.08.2006 (Сб) 4:47

Кстати, я от них уже избавился. Сейчас у меня проблема в другом - при отдалении (а точнее, при крутом повороте камеры от нормали зеркала) отражение срезается, но это ес-сно времено.

Вообще, данная идея затронула меня тем, чтобы использовать один и тот же алгоритм и для отражения окружения на "блестящей" поверхности, и для использования в качестве зеркала, и (ВНИМАНИЕ) для создания интерактивных камер (как, например, в Half-Life 2). Допустим, можно будет создать несколько камер и отображать их картинку в реальном времени на табло (как на стадионе). В процессе убийства бага с искажениями у меня этот эфект сам по себе получился отдельно в разных случаях и в качестве камеры, дисплея, и даже в виде портала (как в Quake). Так что работа сама по себе очень интересная!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 12.08.2006 (Сб) 13:45

DODge
Такие эффекты делаються не CubeMapом... Cube Map юзают доля полного отражения на моделях... Заркало делают через stencil, камеры через простой рендер в текстуру!
#define ROFL 0xDDDD

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Сообщение DODge » 14.08.2006 (Пн) 22:07

Да, но в таком случае все отражение в зеркале расчитывается только на одну плоскость. И так на каждое зеркало на карте. А через CubeMap сразу на весь объект во все стороны.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 15.08.2006 (Вт) 9:57

Я имею ввиду воду и плоское зеркало! Выложишь примерчик, ок?
#define ROFL 0xDDDD

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Сообщение |( () ( T |/| |( » 12.11.2006 (Вс) 19:02

Отрожаеться, но неправильно, нескажите в чём дело?
Код: Выделить всё
Option Explicit
Dim dx As New DirectX8
Dim d3d As Direct3D8
Dim d3dx As New D3DX8
Dim dev As Direct3DDevice8
Dim Mtr As D3DMATRIX
Private Type DX_BALL
    Mesh As D3DXBaseMesh
    Mat As D3DMATERIAL8
    Mtrx As D3DMATRIX
    MRot As D3DMATRIX
    MMove As D3DMATRIX
    mePos As D3DVECTOR
End Type
Dim CubeTex As Direct3DCubeTexture8
Dim CubeC As Direct3DSurface8
Dim CubeZ As Direct3DSurface8
Dim MainC As Direct3DSurface8
Dim MainZ As Direct3DSurface8
Dim I, n As Long
Dim LUp, x As Single
Dim Ball(2) As DX_BALL
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then I = 1
End Sub
Private Sub Form_Load()
Dim DM As D3DDISPLAYMODE
Dim pp As D3DPRESENT_PARAMETERS
Me.Show
Set d3d = dx.Direct3DCreate
d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DM
pp.Windowed = 1
pp.BackBufferCount = 1
pp.BackBufferWidth = Me.ScaleWidth
pp.BackBufferHeight = Me.ScaleHeight
pp.BackBufferFormat = DM.Format
pp.AutoDepthStencilFormat = D3DFMT_D16
pp.EnableAutoDepthStencil = 1
pp.SwapEffect = D3DSWAPEFFECT_DISCARD
pp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES
Set dev = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, pp)
dev.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
For n = 0 To 1
  dev.SetTextureStageState n, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
  dev.SetTextureStageState n, D3DTSS_MIPFILTER, D3DTEXF_LINEAR
  dev.SetTextureStageState n, D3DTSS_MINFILTER, D3DTEXF_LINEAR
  dev.SetTextureStageState n, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
Next n
  Set MainC = dev.GetRenderTarget
  Set MainZ = dev.GetDepthStencilSurface
  Set CubeZ = dev.CreateDepthStencilSurface(128, 128, D3DFMT_D16, D3DMULTISAMPLE_NONE)
  Set CubeTex = d3dx.CreateCubeTexture(dev, 128, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT)
For n = 0 To 1
Init Ball(n)
Rotate Ball(n), 0, 0, 0
MoveM Ball(n), 0, 0, 0
Next
InitLight

Do Until I <> 0: DoEvents
dev.BeginScene
  If Timer - LUp > 0.01! Then
   MoveM Ball(0), 0, 2 * Cos(x), 2 * Sin(x)
    getCub
   D3DXMatrixLookAtLH Mtr, vec3(5, 0, 0), vec3(0, 0, 0), vec3(0, 1, 0)
   dev.SetTransform D3DTS_VIEW, Mtr
   D3DXMatrixPerspectiveFovLH Mtr, 1, 0.75!, 0.1!, 20
   dev.SetTransform D3DTS_PROJECTION, Mtr
   D3DXMatrixIdentity Mtr
   dev.SetTransform D3DTS_WORLD, Mtr
   LUp = Timer: x = x + 0.05
  End If
  dev.SetRenderTarget MainC, MainZ, 0
  dev.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFF0F0F0F, 1, 0
  Render Ball(0)
  Render Ball(1)
dev.EndScene
dev.Present ByVal 0, ByVal 0, 0, ByVal 0
Loop
Set dev = Nothing: Set d3d = Nothing
Set Ball(0).Mesh = Nothing
Set Ball(1).Mesh = Nothing
Unload Me
End Sub
Private Function vec3(x As Single, y As Single, Z As Single) As D3DVECTOR
vec3.x = x: vec3.y = y: vec3.Z = Z
End Function
Private Sub Rotate(D_Mash As DX_BALL, ByVal AngleX As Single, ByVal AngleY As Single, ByVal AngleZ As Single)
Dim MtrxT(3) As D3DMATRIX
  D3DXMatrixRotationX MtrxT(0), AngleX
  D3DXMatrixRotationY MtrxT(1), AngleY
  D3DXMatrixRotationZ MtrxT(2), AngleZ
  D3DXMatrixMultiply MtrxT(3), MtrxT(0), MtrxT(1)
  D3DXMatrixMultiply D_Mash.MRot, MtrxT(2), MtrxT(3)
End Sub
Private Sub MoveM(D_Mash As DX_BALL, ByVal x As Single, ByVal y As Single, ByVal Z As Single)
  D_Mash.mePos.x = x
  D_Mash.mePos.y = y
  D_Mash.mePos.Z = Z
  D3DXMatrixTranslation D_Mash.MMove, D_Mash.mePos.x, D_Mash.mePos.y, D_Mash.mePos.Z
End Sub
Private Sub Init(D_Mash As DX_BALL)
  Set D_Mash.Mesh = d3dx.CreateSphere(dev, n + 0.3, 24, 64, Nothing)
  D_Mash.Mat.diffuse.r = 0.4
  D_Mash.Mat.diffuse.g = 0.01
  D_Mash.Mat.diffuse.b = 0.01
  D_Mash.Mat.diffuse.a = 0
  D_Mash.Mat.Ambient.r = 0.21
  D_Mash.Mat.Ambient.g = 0.1
  D_Mash.Mat.Ambient.b = 0.1
End Sub

Private Sub InitLight()
Dim Light As D3DLIGHT8
Light.Type = D3DLIGHT_DIRECTIONAL
Light.Direction = vec3(3, -3, -3)
Light.diffuse.r = 1
Light.diffuse.g = 1
Light.diffuse.b = 1
Light.Ambient.r = 68 / 255
Light.Ambient.g = 70 / 255
Light.Ambient.b = 90 / 255
dev.SetLight 0, Light
dev.LightEnable 0, 1
End Sub

Private Sub Render(D_Mash As DX_BALL)
D3DXMatrixMultiply D_Mash.Mtrx, D_Mash.MRot, D_Mash.MMove
dev.SetTransform D3DTS_WORLD, D_Mash.Mtrx
dev.SetMaterial D_Mash.Mat
dev.SetRenderState D3DRS_LIGHTING, 1
dev.SetRenderState D3DRS_TEXTUREFACTOR, D3DColorXRGB(100, 100, 100)
dev.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
dev.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
dev.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_TFACTOR
dev.SetTextureStageState 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT3
dev.SetTextureStageState 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR
dev.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_ADD
dev.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
dev.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_DIFFUSE
dev.SetTexture 0, CubeTex
D_Mash.Mesh.DrawSubset 0
End Sub

Private Sub getCub()
D3DXMatrixPerspectiveFovLH Mtr, 3.141593 / 2, 1, 0.1, 100
dev.SetTransform D3DTS_PROJECTION, Mtr
For n = 0 To 5
  Mtr = GetCubeMapViewMatrix(n, vec3(0, 0, 0))
  dev.SetTransform D3DTS_VIEW, Mtr
  Set CubeC = CubeTex.GetCubeMapSurface(n, 0)
  dev.SetRenderTarget CubeC, CubeZ, 0
  dev.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, D3DColorXRGB(50, 50, 50), 1, 0
  Render Ball(0)
Next n
End Sub

Public Function GetCubeMapViewMatrix(Face As Long, vEye As D3DVECTOR) As D3DMATRIX
Dim vLook As D3DVECTOR
Dim vUp As D3DVECTOR
  Select Case Face
    Case D3DCUBEMAP_FACE_POSITIVE_X
      vLook = vec3(vEye.x + 1!, vEye.y, vEye.Z)
      vUp = vec3(0!, 1!, 0!)
    Case D3DCUBEMAP_FACE_NEGATIVE_X
      vLook = vec3(vEye.x - 1!, vEye.y, vEye.Z)
      vUp = vec3(0!, 1!, 0!)
    Case D3DCUBEMAP_FACE_POSITIVE_Y
      vLook = vec3(vEye.x, vEye.y + 1!, vEye.Z)
      vUp = vec3(0!, 0!, -1!)
    Case D3DCUBEMAP_FACE_NEGATIVE_Y
      vLook = vec3(vEye.x, vEye.y - 1!, vEye.Z)
      vUp = vec3(0!, 0!, 1!)
    Case D3DCUBEMAP_FACE_POSITIVE_Z
      vLook = vec3(vEye.x, vEye.y, vEye.Z + 1!)
      vUp = vec3(0!, 1!, 0!)
    Case D3DCUBEMAP_FACE_NEGATIVE_Z
      vLook = vec3(vEye.x, vEye.y, vEye.Z - 1!)
      vUp = vec3(0!, 1!, 0!)
  End Select
  D3DXMatrixLookAtLH GetCubeMapViewMatrix, vEye, vLook, vUp
End Function

С=[::::::::::> ™ e398wallpapers.narod.ru

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 12.11.2006 (Вс) 19:11

|( () ( T |/| |(
скрин покажи...
#define ROFL 0xDDDD

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Сообщение |( () ( T |/| |( » 12.11.2006 (Вс) 19:25

Вот скрин, но наглядние если код откомпилировать.
У вас нет доступа для просмотра вложений в этом сообщении.
С=[::::::::::> ™ e398wallpapers.narod.ru

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 13.11.2006 (Пн) 16:47

хм... Вроде правильно :)
#define ROFL 0xDDDD

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

Сообщение Mikle » 15.11.2006 (Ср) 14:06

|( () ( T |/| |(
Направь камеру с позиции vec3(0,0,-5), все станет на место, а с остальных позиций камеры выглядит некорректно потому, что ты не меняешь трансформацию текстуры отражений (где у тебя SetTransform D3DTS_TEXTURE...?)

Igor Afanasev
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 13.01.2007 (Сб) 21:25

Сообщение Igor Afanasev » 13.01.2007 (Сб) 22:06

DODge писал(а):Кстати, я от них уже избавился. Сейчас у меня проблема в другом - при отдалении (а точнее, при крутом повороте камеры от нормали зеркала) отражение срезается, но это ес-сно времено.


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

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

Сообщение Mikle » 16.01.2007 (Вт) 18:59

Igor Afanasev
Для отражения от плоских поверхностей лучше использовать проективную текстуру. Можно в CubeMap вносить поправки, но это не настолько точно.


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

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

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

    TopList