раскодировать текстуру через IntPtr

Общие вопросы о Unity3D

раскодировать текстуру через IntPtr

Сообщение jetyb 28 ноя 2013, 09:00

Привет.

У Texture2D есть метод GetNativeTexturePtr(), возращающий объект типа IntPtr. Как из этого объекта вытянуть байты пикселей?
Marshal.Copy выдает какой-то ненулевой массив байтов на абсолютно черной текстуре.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: раскодировать текстуру через IntPtr

Сообщение seaman 28 ноя 2013, 09:35

Ну а мануал почитать слабо?
On Direct3D-like devices this returns a pointer to the base texture type (IDirect3DBaseTexture9 on D3D9, ID3D11Resource on D3D11). On OpenGL-like devices the texture "name" is returned; cast the pointer to integer type to get it. On platforms that do not support native code plugins, this function always returns NULL.

Т.е. во первых на разных платформах по разному., во вторых - изучайте соответствующее АПИ (DX/OGL)
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: раскодировать текстуру через IntPtr

Сообщение kripto289 29 ноя 2013, 21:53

jetyb писал(а):Привет.

У Texture2D есть метод GetNativeTexturePtr(), возращающий объект типа IntPtr. Как из этого объекта вытянуть байты пикселей?
Marshal.Copy выдает какой-то ненулевой массив байтов на абсолютно черной текстуре.

Как это ненулевой массив байтов на чёрной текстуре? Само по себе, всё что не равно 0 уже не чёрный цвет.
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: раскодировать текстуру через IntPtr

Сообщение Woolf 30 ноя 2013, 02:15

kripto289 писал(а):rак это ненулевой массив байтов на чёрной текстуре? Само по себе, всё что не равно 0 уже не чёрный цвет.


byte[] array !=null

L-)
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: раскодировать текстуру через IntPtr

Сообщение jetyb 30 ноя 2013, 22:41

Нет, массив именно не null - евой, он состоит вовсе не из сплошных 0.
Не ноли не только в начале массива, но и в середине без заметной периодики. Платформа dx11, несколько раз проверял.
Могу предположить, что из-за сыроватости нового dx11 в IntPtr копируются данные из какой-то левой рендер текстуры.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: раскодировать текстуру через IntPtr

Сообщение Woolf 01 дек 2013, 08:11

jetyb писал(а):Нет, массив именно не null - евой, он состоит вовсе не из сплошных 0.
Не ноли не только в начале массива, но и в середине без заметной периодики. Платформа dx11, несколько раз проверял.
Могу предположить, что из-за сыроватости нового dx11 в IntPtr копируются данные из какой-то левой рендер текстуры.


Да скорее всего он вам dds или dxt возвращает.

из-за сыроватости нового dx11

Ну-ну.. С чего это дх11 новый и с чего это он сырой? Уже кони подохли с той поры, когда дх11 вышел.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: раскодировать текстуру через IntPtr

Сообщение cleoag 01 дек 2013, 10:27

Не понял вопроса )

У тебя уже есть Texture2D в юнити, тогда ты можешь получить ее пиксели через Color32[] pix = texture.GetPixels32();
Обычно GetNativeTexturePtr нужен чтобы потом его передать в с++ dll и уже там потрошить. примерно так
cleoag
UNец
 
Сообщения: 2
Зарегистрирован: 28 сен 2013, 22:10

Re: раскодировать текстуру через IntPtr

Сообщение jetyb 01 дек 2013, 14:23

GetPixels32 сейчас и использую, но GetNativeTexturePtr на порядок быстрее работает. Да и туповато это слегка - получать Color32 на 8 битной текстуре.
Производительнее код просто сделать хочется.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: раскодировать текстуру через IntPtr

Сообщение Woolf 01 дек 2013, 15:54

jetyb писал(а):GetPixels32 сейчас и использую, но GetNativeTexturePtr на порядок быстрее работает. Да и туповато это слегка - получать Color32 на 8 битной текстуре.
Производительнее код просто сделать хочется.


1) GetPixels32 работает с текстурой в видеопамяти, GetNativeTexturePtr в обычной памяти. Потому разница в скорости такая. Если вы хотите отображать что-то на текстуре, вам все равно придется её в видеопамять слать.
2) GetPixels32 работает с текстурами в формате юнити (DXT1 вроде) на любой платформе одинаково, GetNativeTexturePtr - штука очень платформозависимая и даже на winXP и win7 вернет разные данные, не то, что на маках.
3) получать Color32 на 8 битной текстуре - исходная текстура может быть хоть однобитная, вас это не должно волновать, в видеопамяти они все хранятся одинаково.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9