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

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

Спасибо.
Силам добра не одержать победы над силами Разума!
Re: Вопрос по DirectX9
От: Alexey Chen Чили  
Дата: 30.09.03 11:00
Оценка:
Здравствуйте, Eleon, Вы писали:

E>Вот такая проблема: Нужен быстрый блиттинг в 2D. В Dx7 были функции типа IDirectDrawSurface7->Blt, ->BltFast, и им подобные.

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

Самым эффективным будет вывести через 3D, это совершенно серьезно. При этом ты получишь практически бесплатный альфаканал и масштабирование.
Re[2]: Вопрос по DirectX9
От: Evgolas Россия http://DelaDarom.Ru
Дата: 22.12.05 10:38
Оценка:
Здравствуйте, Alexey Chen, Вы писали:

AC>Самым эффективным будет вывести через 3D, это совершенно серьезно. При этом ты получишь практически бесплатный альфаканал и масштабирование.


Не могли бы вы уточнить, что значит "вывести через 3D"?

Создать набор точек и их отдать на отрисовку?
Или для каждого кадра создавать текстуру и отображать ее на двух треугольниках?
-----------------------------
Сервис Услуга-за-Услугу
Городской рогейн для роллеров
Заметки шароварщика
-----------------------------
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. Ещё что-нибудь подсказать?
Re[3]: Вопрос по DirectX9
От: DEMON HOOD  
Дата: 22.12.05 22:08
Оценка:
Здравствуйте, Evgolas, Вы писали:

E>Не могли бы вы уточнить, что значит "вывести через 3D"?

создать полигон и натянуть текстуру.
silent RSDN@Home 1.2.0 alpha [618] Windows XP 5.1.2600.65536
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.