Товарищи Программеры! Все вы, наверное, видели хоть раз такую игруху
под названием StarCraft. Так вот, в ней все менюшки и окошки выводятся
поверх всего прочего изображения с неким свойством полупрозрачности.
Вопрос состоит в том, как сделать подобный эффект.
Сразу скажу, что попытки сотворить что-то вроде alpha-blending, уже
были. Ну, самый простой, вроде бы, метод прямого доступа к поверхности через
метод ::Lock(...). Как можно догадаться, пишу я на С++, но перевариваю все
от ВизуалБасика до Дельфи с Ассемблером. Но проблема в том, что
если исп. прямой доступ, то всем этим дело приходится заниматься процессору.
А это ОЧЕНЬ долго. И при этом "отрендерить" даже полэкрана в 640х480*16
уже просто невыносимо даже на Селероне с 533 МХз. И вот что еще
(дабы не подумали, что я полный ламер), я в книге Краснова по DirectX в Delphi
вычитал, что НИКАКИХ аппаратных средств DD не предоставляет для полупрозрачности и,
следовательно, дескать, используйте для этого D3D. Но это сложно. И потом,
ну неужто StarCraft использует D3D? И ведь он не тормозит нигде, хотя вывод куда
более сложный, чем в моей собственной игре (Тени-то тоже полупрозрачные!!!).
Так что если вдруг кто-либо что-нибудь знает по этому поводу, напишите пожалуйста.
Желательно на С++, можно со вставками на ASM'e.
P.S. DirectX 7.SDK у меня есть, но !!!! ПЕРЕПИСАННЫЙ СЛОВО В СЛОВО НА С++
С БЕЙСИКА ПРИМЕР Fire.vbp ТОРМОЗИТ по-страшному. (ЛИБО Я ПЛОХО ПИШУ И НА С++, либо ...). И еще. Может кто-либо слышал про такую клевую игрушку под вредакцией (:-)
Seumas McNally под названием DXBall 2. Там тоже есть ни-фига-не-тормозящий-прямой-доступ-к-памяти, но КАК ЭТО СДЕЛАНО БЕЗ ТОРМОЗОВ, я не понимаю!!! ЧТО ДЕЛАТЬ?
Ув. программеры, даже если есть какой-либо пример с прямым доступом, где
изменяется хоть квадрат 50х50 точек в 16битном режиме, и его не жалко распространять,
толкните его мне в качестве гуманитарной помощи.
А если вдруг кто-либо знает сайт, на котором подобные фиговины можно скачать
без проблем, то укажите хотя бы этот адрес. Заранее спасибо.
С уважением, MVN.
30.03.03 12:02: Перенесено модератором из 'Мультимедиа, графика, звук' — H_D
Здравствуйте Аноним.
Ты же Lock()'ишь буффер — тебе все доступно. Попробуй интерполировать. Ручками. И лучше на ASM'е — быстрее выйдет.
Не ищи легких путей, ибо они — источники неразберихи (почем ты знаешь, через сколько колен там сделано)...
EW
привет.
поробуй сделать primary/secondary поверхность в системной памяти и поверхность которую ты собираешься блитать там же (можешь даже по комбинировать) — как понимаешь доступ к системной памяти происходит быстрее. — а лучше используй аппаратный альфа-блендинг через d3d. для этого можешь посмотри пример из NukeDX2 —
http://www.nukesoftware.com/
.
Здравствуйте Laguna, Вы писали:
L>привет.
L>поробуй сделать primary/secondary поверхность в системной памяти и поверхность которую ты собираешься блитать там же (можешь даже по комбинировать) — как понимаешь доступ к системной памяти происходит быстрее. — а лучше используй аппаратный альфа-блендинг через d3d. для этого можешь посмотри пример из NukeDX2 — http://www.nukesoftware.com/
! Первичную в системной создать невозможно.
Насколько я помню SC, полупрозрачность там только по отношению 1 и выше уровней поверхеностей к бэкгрунду.
Можно попробовать так — создать поверхность аналогичную бэкграунду, применив к ней эффект прозрачности. Эту поверхность использовать как источник фона при формировании кадра верхних поверхностей. Выводить на поверхность меню текст etc... При этом отпадает необходимость каждый раз софтверно обращаться к поверхностям в В/П + не нужно расчитывать цвет пикселя, для получения эффекта прозрачности.
Здравствуйте Laguna, Вы писали:
L>привет.
L>поробуй сделать primary/secondary поверхность в системной памяти и поверхность которую ты собираешься блитать там же (можешь даже по комбинировать) — как понимаешь доступ к системной памяти происходит быстрее. — а лучше используй аппаратный альфа-блендинг через d3d. для этого можешь посмотри пример из NukeDX2 — http://www.nukesoftware.com/
L>.
Спасибо за ссылку...