Форум: "Media";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизОтображение в D3Dx 2х-мерных изображений Найти похожие ветки
← →
h8394E (2006-06-02 16:24) [0]Доброго времени суток. Я уже второй день сижу над D3Dx, аон не фурычит.... У меня должна из файла *.bmp загружаться текстура, копироваться в спрайт и выводиться на экран, под разным углом. Я сделал всё, как говорится "по книжке", а точнее по статье, а оно не фурычит - ничего не выводит. Даже когда поставить паузу на строчке кода - на красном кружке появляется галочка, а в момент выполнения программы - порга не останавливается, как будто тот участок кода не выполняется. Что я не так сделал?
Даю код:
var
g_pD3D: IDirect3D8;
g_device: IDirect3DDevice8;
DispMode:_D3DDISPLAYMODE;
D3D_pp:TD3DPRESENT_PARAMETERS;
g_pTexture: IDirect3DTexture8;
g_pSprite: ID3DXSprite;
hR:hResult;
WindowHandle:hWnd;
procedure IniDirX;
begin
g_pD3d:=Direct3DCreate8(D3D_SDK_VERSION);
// if g_pD3d=nil then exit;
hr:=g_pD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DispMode);
ZeroMemory(@D3D_pp, sizeof(D3D_pp));
D3D_pp.Windowed:=BOOL(False);
D3D_pp.BackBufferWidth:=ScreenWidth;
D3D_pp.BackBufferHeight:=ScreenHeight;
D3D_pp.BackBufferFormat:=DispMode.Format;
D3D_pp.SwapEffect:=D3DSWAPEFFECT_DISCARD;
hR:=g_pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, WindowHandle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3D_pp, g_device);
hR:=D3DXCreateSprite(g_device, g_pSprite);
hR:=D3DXCreateTextureFromFileEx(g_device, "Cells.bmp", 32, 16,D3DX_DEFAULT, 0, D3DFMT_UNKNOWN,D3DPOOL_DEFAULT, D3Dx_FILTER_NONE, D3DX_FILTER_NONE,
D3DCOLOR_XRGB(255,255,255), nil, nil, g_pTexture);
DrawSpriteOnScreen;
end;
procedure DrawSpriteOnScreen;
var
CRect:Trect;
Scal, Rot, trans:TD3DXVECTOR2;
begin
Scal.x:=1.0;
Scal.y:=1.0;
Rot.x:=16;
Rot.y:=7.5;
Trans.x:=0;
trans.y:=0;
SetRect(CRect, 0,0,32,15);
g_device.Clear(0, nil, D3DCLEAR_TARGET, $ff00ff00, 1.0, 0);
g_device.BeginScene;
g_pSprite.Draw(g_pTexture, @CRect, @Scal, @Rot, D3DX_PI*45/180.0, @Trans, $ffffffff);
g_device.EndScene;
g_device.Present(nil, nil, 0, nil);
g_device.SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
end;
← →
a22 © (2006-06-02 16:34) [1]не надо использовать ID3DXSprite, он медленный. сделайте руками VertexBuffer на 4 вершины
b d
|\|
a c
занесите a,b,c,d. рисуйте стрипом
вершины вносите в буфер с D3DFVF_XYZRHW, это позволит избежать обсчета геометрии и даст возможность задавать координаты сразу в координатах текущего рендертаргета (в стандартном случае - в кординатах экрана)
← →
Sapersky (2006-06-02 18:47) [2]VertexBuffer при рисовании 4 вершин не нужен. Проще (и даже несколько быстрее) DrawPrimitiveUP.
Да, кстати, поворачивать тогда придётся самому, хотя это не сложно и не долго (вершины, а не картинку).
Что касается примера с ID3DXSprite - надеюсь, рисуется всё в цикле, а не один раз? И зачем сразу на полный экран? Опять же, надо проверить параметры g_pSprite.Draw, или выставить всё что можно для начала в nil.
← →
h8394E (2006-06-02 19:02) [3]Ой, я - дура-ааак... Пишу-то всё на WinAPI... И окно создаю в отдельной процедуре. В той-же порцедуру цикл обработки сообщений написал. Получилось, что у меня инициализация и рисование происходило сразу после выхода...
А что на чсёт скорости, так я думаю, что в любом случае будет быстрее, чем
Image1.picture.canvas.draw(x, y, TurnPicture(Bitmap, 38));
И это было в каждом кадре раз по 30... И скорость было 60 кадров в сек.
Так что если у меня со спрайтом будет 120, то - нормально...
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.044 c