ПрограммированиеФорумГрафика

Из текстуры в Bitmap и обратно, DirectX 9

Страницы: 1 2 3 Следующая »
#0
16:21, 17 апр 2016

Как из текстуры (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()

#1
16:38, 17 апр 2016

Ramm
В DX9 разве нет ограничений на маппинг текстуры?
Я не уверен насчет этого. В DX11 ты обычную текстуру вообще не можешь прочитать в программе.

#2
17:04, 17 апр 2016

-Eugene-
Можно в нее рисовать, получая доступ к пикселям. По идее, ведь и считывать их можно?

#3
17:06, 17 апр 2016

Ramm
> Можно в нее рисовать, получая доступ к пикселям
Получая доступ к пикселям на GPU.

> По идее, ведь и считывать их можно?
Разумеется можно. Тоже на GPU. Любой шейдер, рисующий объект, делает это тысячи раз.

Кстати, что эта функция делает, по твоему?
> LockRect(0, LockedRect, 0, 0);

#4
17:11, 17 апр 2016

-Eugene-
Если можно

imageData[index] = 0xffff0000;

Может быть можно и

DWORD px = imageData[index];

А там не важно где это, мне считать и в битмап засунуть. А я считать не могу.

-Eugene-
> Кстати, что эта функция делает, по твоему?

> Этот метод позволяет получить указатель на память
> поверхности. После этого, используя арифметику указателей, мы можем читать и записывать отдельные пиксели поверхности.

#5
17:25, 17 апр 2016

Ramm
> Этот метод позволяет получить указатель на память поверхности
У этого метода штук десять разных режимов работы. Какой из них используется?

#6
18:20, 17 апр 2016

Ramm
> RenderTexture.GetLevelDesc(0, SurfaceDesc);
> RenderTexture.LockRect(0, LockedRect, 0, 0);
Это скомпилировалось? Странно, я всегда делал

RenderTexture.GetLevelDesc(0, @SurfaceDesc);
RenderTexture.LockRect(0, @LockedRect, 0, 0);
#7
7:31, 18 апр 2016

Delfigamer
> Это скомпилировалось? Странно, я всегда делал
>
> RenderTexture.GetLevelDesc(0, @SurfaceDesc);
> RenderTexture.LockRect(0, @LockedRect, 0, 0);
При попытке отправить адрес, у меня не компилится. Ну, объекты в Дельфях и так передаются по ссылке.
-Eugene-
> У этого метода штук десять разных режимов работы. Какой из них используется?

RenderTexture.LockRect(0, LockedRect, 
0, // блокируем всю поверхность
0); // дополнительных параметров блокировки нет

Вот так.

#8
8:28, 18 апр 2016

Проверь hresult возвращенный Локом
Уверен эта текстура не запираемая или параметры блокировки неверные.

#9
8:32, 18 апр 2016

Ramm
> // дополнительных параметров блокировки нет
Уверен?
Какой из режимов при этом используется?

Я не как Иннуэнто, я просто с дх9 не работал лет пять.

#10
8:44, 18 апр 2016

Ну там параметры
nosyslock - без какой-то там блокировки
Discard - блокируется для записи вроде, не прерывает рендеринг.
По окончанни оригинальный ресурс удаляется заменяясь новым
Nooverwrite - непомню че.

На опыте не случалось что из-за параметров чето не блокироалось, просто параметры не имели силы если не валидны. А вот если ресурс не блокируемый то там фейл.
Правда там есть функция копирования (блиттинга) сурфейса в сурфейс с помощью которого можно запросто блитнуть неблокируемую текстуру в sysmem текстуру и читать.

#11
8:47, 18 апр 2016

Полагаю что у рендертекстуры в силу ограничений нет возможности прямого доступа и надо её копировать в читаемую сначало.

#12
9:34, 18 апр 2016

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
> рендертекстуры в силу ограничений нет возможности прямого доступа и надо её
> копировать в читаемую сначало
Как текстуры копируют?

#13
9:45, 18 апр 2016

Ramm
Метод д3ддевайса , updatesurface вроде
А нет вру он не умеет брать с рендертаргета, это для норм текстур тоже

#14
10:21, 18 апр 2016

GetRenderTargetData кароч. Смотри msdn :)

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.