Re: Вопрос по DirectX9
От: ErV Россия  
Дата: 22.12.05 16:05
Оценка: +1
E>Вот такая проблема: Нужен быстрый блиттинг в 2D. В Dx7 были функции типа IDirectDrawSurface7->Blt, ->BltFast, и им подобные. В Dx9 поверхности остались, есть способ читать/писать (StretchBlt, D3DXLoadSurfaceFromSurface, Update), но не ясно, как выводить картинки с колор-кеем или по маске. В LoadSfromS есть параметр ColorKey, но в результате его работы область, которая должна была остаться чистой, выводится именно цветом ключа. Возможно, нужно настроить "прозрачный" цвет на поверхности-приемнике, но где? Можно получить HDC поверхности, и блиттить с помощью Windows GDI, но на хрена тогда DirectX? А можно, например, получить адрес поверхности и вообще писать прямо в память по байтам. Но опять таки, зачем тогда Dx.

E>В общем, подскажите, как вывести картинку сложной формы в BackBuffer в Dx9, не используя при этом 3D? И какой способ будет самым эффективным?


E>Спасибо.


Самый простой вариант следующий —
используешь формат вершины — D3DFVF_XYZRHW|D3DFVF_TEX1 (или какой тебе больше нужен — может, ты хочешь по четыре текстуры через пиксельный шейдер смешивать — это тоже возможно).

вершина после этого будет следующая
struct sVertex2D{
float x, y, z, w;
float u, v;
};
или
struct sVertex2D{
D3DXVECTOR4 vpos;
D3DXVECTOR2 tex;
};
— как больше нравиться.

данные — x, y, координаты на экране- соответствуют номерам пикселей, но во float.
z = 0;
w = 1;
u, v — текстурные координаты.

Дальше созаешь меш из двух фасок, — квадратик, на котором "натянут" нужный тебе спрайт.
И, соответственно, рисуешьэтот квадратик.
Минус — чтобы "квадратик" изменить, меш надо лочить.
И ещё — рекомендуется для всего этого использовать IndexBuffer — я странные глючи получал, когда без него работал — просто не рисовалось ничего. вообще ничего.

Кроме того, если вариант с LPD3DVERTEXBUFFER9/LPD3DINDEXBUFFER9 тебе не нравиться, можешь использовать
функции IDirect3DDevice->DrawPrimitiveUP/DrawIndexedPrimitiveUP — они рисуют примитивы из оперативной памяти, но работают медленнее (НАМНОГО медленнее!!!) Не рекомендуется ими рисовать что-то серъёзное. Дальше — эти процедуры на моём радеоне вызывали глюки, плюс проблемы, если включено выравнивании структур при компиляции.

Далее — есть в D3DX такой клас — ID3DXSprite.
Лично мне он не нравиться — неудобен, и вызывает подозрение по поводу его реализации. НО, может быть он тебе подойдёт..

P.S. Ещё что-нибудь подсказать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.