Как из текстуры (IDirect3DTexture9) преобразовать в битмап?
Насколько я понял, текстура имеет вид строки...
Есть некоторая текстура:
RenderTexture: IDirect3DTexture9;
Если вывести ее в файл с помощью D3DXSaveTextureToFile, то все выходит корректно
Я пытался сделать так:
LockedRect: D3DLOCKED_RECT; SurfaceDesc: D3DSURFACE_DESC; RenderTexture.GetLevelDesc(0, SurfaceDesc);// Получаем описание поверхности RenderTexture.LockRect( 0, LockedRect, 0, 0);// Получаем указатель на данные пикселей поверхности а затем пытаюсь организовать цикл, но LockedRect.Pitch у меня РАВЕН 0! RenderTexture.UnlockRect( 0);
Что я делаю не так? Как конвертировать текстуру в битмап?
А, и еще, как из битмапа в ОЗУ создать текстуру?
device.CreateTexture()
Ramm
В DX9 разве нет ограничений на маппинг текстуры?
Я не уверен насчет этого. В DX11 ты обычную текстуру вообще не можешь прочитать в программе.
-Eugene-
Можно в нее рисовать, получая доступ к пикселям. По идее, ведь и считывать их можно?
Ramm
> Можно в нее рисовать, получая доступ к пикселям
Получая доступ к пикселям на GPU.
> По идее, ведь и считывать их можно?
Разумеется можно. Тоже на GPU. Любой шейдер, рисующий объект, делает это тысячи раз.
Кстати, что эта функция делает, по твоему?
> LockRect(0, LockedRect, 0, 0);
-Eugene-
Если можно
imageData[index] = 0xffff0000;
Может быть можно и
DWORD px = imageData[index];
А там не важно где это, мне считать и в битмап засунуть. А я считать не могу.
-Eugene-
> Кстати, что эта функция делает, по твоему?
> Этот метод позволяет получить указатель на память
> поверхности. После этого, используя арифметику указателей, мы можем читать и записывать отдельные пиксели поверхности.
Ramm
> Этот метод позволяет получить указатель на память поверхности
У этого метода штук десять разных режимов работы. Какой из них используется?
Ramm
> RenderTexture.GetLevelDesc(0, SurfaceDesc);
> RenderTexture.LockRect(0, LockedRect, 0, 0);
Это скомпилировалось? Странно, я всегда делал
RenderTexture.GetLevelDesc(0, @SurfaceDesc); RenderTexture.LockRect( 0, @LockedRect, 0, 0);
Delfigamer
> Это скомпилировалось? Странно, я всегда делал
>
> RenderTexture.GetLevelDesc(0, @SurfaceDesc);
> RenderTexture.LockRect(0, @LockedRect, 0, 0);
При попытке отправить адрес, у меня не компилится. Ну, объекты в Дельфях и так передаются по ссылке.
-Eugene-
> У этого метода штук десять разных режимов работы. Какой из них используется?
RenderTexture.LockRect(0, LockedRect, 0, // блокируем всю поверхность 0); // дополнительных параметров блокировки нет
Вот так.
Проверь hresult возвращенный Локом
Уверен эта текстура не запираемая или параметры блокировки неверные.
Ramm
> // дополнительных параметров блокировки нет
Уверен?
Какой из режимов при этом используется?
Я не как Иннуэнто, я просто с дх9 не работал лет пять.
Ну там параметры
nosyslock - без какой-то там блокировки
Discard - блокируется для записи вроде, не прерывает рендеринг.
По окончанни оригинальный ресурс удаляется заменяясь новым
Nooverwrite - непомню че.
На опыте не случалось что из-за параметров чето не блокироалось, просто параметры не имели силы если не валидны. А вот если ресурс не блокируемый то там фейл.
Правда там есть функция копирования (блиттинга) сурфейса в сурфейс с помощью которого можно запросто блитнуть неблокируемую текстуру в sysmem текстуру и читать.
Полагаю что у рендертекстуры в силу ограничений нет возможности прямого доступа и надо её копировать в читаемую сначало.
Mira
rez: hresult; RenderTexture.GetLevelDesc (0, desc); rez:=RenderTexture.LockRect ( 0, lr, 0, 0); if rez=D3DLOCK_nosyslock then
проверил и остальные:
D3DLOCK_READONLY
D3DLOCK_NOOVERWRITE
D3DLOCK_DISCARD
И нифига. Ни один из них.
Mira
> Nooverwrite
флаг используется только для динамических буферов, можно только дописывать
-Eugene-
Самое веселое... что я не знаю.
Я попробовал реализовать так
http://www.cleoag.ru/2013/05/12/directx-texture-hbitmap/
Но у меня pitch=0.
Mira
> рендертекстуры в силу ограничений нет возможности прямого доступа и надо её
> копировать в читаемую сначало
Как текстуры копируют?
Ramm
Метод д3ддевайса , updatesurface вроде
А нет вру он не умеет брать с рендертаргета, это для норм текстур тоже
GetRenderTargetData кароч. Смотри msdn :)
Тема в архиве.