Зеркала... Хотим?

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

Модератор: Mikle

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Зеркала... Хотим?

Сообщение d3drm » 10.04.2004 (Сб) 14:25

Народ! Работал над созданием зеркальных отражений в dx8 и даже кое-что получилось. Но есть проблема. При создании зеркал нужно перевести изображение из поверхности (Direct3dSurface8) в обыкновенную текстуру. Я делаю это обыкновенным сохранением и загрузкой, но это снижает скорость до 0 fps, сколько бы ни было объектов на сцене. Если мне кто-нибудь поможет, то готов поделиться примером с использованием зеркала.
ХЎ

dxvb
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.02.2004 (Сб) 16:28

Зеркало

Сообщение dxvb » 16.04.2004 (Пт) 15:27

Зеркало можно рисовать и другим методом без использования рендеринга в текстуру. Рисовать сцену всё равно приходится два раза. Первый раз рендерится всё кроме зеркала, а во второй раз рендерятся объекты, которые должны отражаться в зеркале. Рисуются они так, как выглядели бы отражёнными в зеркале, причём только в том месте, которое занимало зеркало (это делается с помощью плоскостей отсечения) - короче говоря см. код ниже.
Код: Выделить всё
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


Целиком проект можно скачать с моего сайта directx-vb.narod.ru.

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

Сообщение Mikle » 16.04.2004 (Пт) 15:50

d3drm
Так я ж тебе отправил пример с рендером в сурфейс текстуры в ветке Копирование изображения...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 17.04.2004 (Сб) 9:56

Да-да... тока короче я еще спрашивал как мне из сурфейса в текстуру перевести. в общем не важно, данный способ я уже сам нашел, в принципе неплохо выглядит. Спасибо тем не менее.
ХЎ


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

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

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

    TopList  
cron