Модератор: Mikle
Public Sub RenderMirror()
Dim matWorldSaved As D3DMATRIX 'Сохраняемая матрица мира
Dim matReflectInMirror As D3DMATRIX
Dim Plane As D3DPLANE 'плоскость
'a, b, c, d - координаты вершин зеркала
'здесь они задаются статистически, но,
'в большинстве случаев они задаются динамически
Dim a As D3DVECTOR
Dim b As D3DVECTOR
Dim c As D3DVECTOR
Dim d As D3DVECTOR
a = vec3(-2, -2, 0)
b = vec3(-2, 2, 0)
c = vec3(2, 2, 0)
d = vec3(2, -2, 0)
g_D3DDevice.GetTransform D3DTS_WORLD, matWorldSaved
'создаём плоскость по трём точкам
D3DXPlaneFromPoints Plane, a, b, c
'создаём матрицу, "отражённую" от плоскости зеркала
D3DXMatrixReflect matReflectInMirror, Plane
g_D3DDevice.SetTransform D3DTS_WORLD, matReflectInMirror
g_D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_CW
'Это - самое важное место программы
'здесь создаются плоскости отсечения,
'которые отрезают изображение, оказавшееся
'за пределами зеркала
Call D3DXPlaneFromPoints(Plane, c, b, g_EyePoint): g_D3DDevice.SetClipPlane 0, Plane
Call D3DXPlaneFromPoints(Plane, d, c, g_EyePoint): g_D3DDevice.SetClipPlane 1, Plane
Call D3DXPlaneFromPoints(Plane, a, d, g_EyePoint): g_D3DDevice.SetClipPlane 2, Plane
Call D3DXPlaneFromPoints(Plane, b, a, g_EyePoint): g_D3DDevice.SetClipPlane 3, Plane
'Благодаря этой плоскости в зеркале
'отражается только то, что находится
'перед ним
Call D3DXPlaneFromPoints(Plane, c, b, a): g_D3DDevice.SetClipPlane 4, Plane
g_D3DDevice.SetRenderState D3DRS_CLIPPLANEENABLE, D3DCLIPPLANE0 Or D3DCLIPPLANE1 _
Or D3DCLIPPLANE2 Or D3DCLIPPLANE3 Or D3DCLIPPLANE4
'Здесь мы повторно рендерим сцену
'из нового положения
RenderScene
'В конце мы возвращаем предыдущие
'параметры рендеринга
g_D3DDevice.SetTransform D3DTS_WORLD, matWorldSaved
g_D3DDevice.SetRenderState D3DRS_CLIPPLANEENABLE, 0
g_D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW
'Прорисовка самого зеркала
Dim col As D3DCOLORVALUE 'структура для хранения цветов (ARGB)
Dim mtrl As D3DMATERIAL8 'материал
With col: .r = 0.5: .g = 0.5: .b = 0.5: .a = 0.5: End With
mtrl.diffuse = col
mtrl.Ambient = col
g_D3DDevice.SetMaterial mtrl
g_D3DDevice.SetTexture 0, Nothing
Dim v As CUSTOMVERTEX
g_D3DDevice.SetStreamSource 0, g_VB, Len(v)
g_D3DDevice.SetVertexShader D3DFVF_CUSTOMVERTEX
g_D3DDevice.DrawPrimitive D3DPT_TRIANGLEFAN, 0, 2
End Sub
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18