LoadRawTextureData [РЕШЕНО]

Программирование на Юнити.

LoadRawTextureData [РЕШЕНО]

Сообщение [bm] 22 янв 2014, 16:35

У кого-нибудь получилось загрузить текстуру таким методом? Texture2D.LoadRawTextureData

пытаюсь загрузить dds текстуру, все грузит без ошибок, но получаю вертикальную "тельняшку".

Синтаксис:
Используется csharp
var bytes = File.ReadAllBytes(ddspath);
var txt = new Texture2D(1024, 1024, TextureFormat.DXT1, false);
txt.LoadRawTextureData(bytes);


FIXED: забыл применить Apply() после загрузки текстуры
Последний раз редактировалось [bm] 19 фев 2014, 13:01, всего редактировалось 2 раз(а).
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: LoadRawTextureData

Сообщение seaman 22 янв 2014, 18:52

Недокументированная функция.
ТУТ ее нет. Но если знаешь, что она есть, найти МОЖНО.
Думаю, что так же как и ТУТ можно только JPG или PNG
PS^ Если сообразите как без сильных сложностей типа библиотек DevIl или FreeImage загрузить рантайм dds изображение - буду очень рад.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: LoadRawTextureData

Сообщение BornFoRdeatH 22 янв 2014, 19:05

В гугле второе по списку

Синтаксис:
Используется csharp
public class RawTex : MonoBehaviour {

    void Start() {
        int w = 50;
        int h = 50;

        Texture2D texture = new Texture2D(w, h, TextureFormat.RGB24, false);
        byte[] data = new byte[w * h * 3];

        int pixel = 0;

        for (int y = 0; y < h; y++) {
            for (int x = 0; x < w; x++) {
                if (y % 2 == 0) {
                    data[pixel] = 255;
                    data[pixel+1] = 0;
                    data[pixel+2] = 0;
                } else {
                    data[pixel] = 0;
                    data[pixel+1] = 0;
                    data[pixel+2] = 255;                        
                }

                pixel += 3;
            }
        }

        texture.LoadRawTextureData(data);
        texture.Apply();
        renderer.material.mainTexture = texture;
    }
}
 


Кстати данный метод добавлен с юньки 4.3, тоесть он всего ничего как существует.
Added Texture2D.LoadRawTextureData for loading already-made (e.g. DXT/PVRTC compressed) raw data.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: LoadRawTextureData

Сообщение seaman 22 янв 2014, 19:16

Пример не понятен. То что формируется в массиве data - уж точно не dxt. Возможно PVRTC, но тоже что-то не верится.
Если это грузит dds текстуры - это класс!!!
Блин, когда уже нормальная документация будет...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: LoadRawTextureData

Сообщение BornFoRdeatH 22 янв 2014, 19:25

seaman писал(а):Пример не понятен. То что формируется в массиве data - уж точно не dxt. Возможно PVRTC, но тоже что-то не верится.

Просто я криворукий не все процитировал, человек доступно обьясняет.
The format of the raw data depends on the TextureFormat you create the Texture2D with. In this case it's RGB24 and I'm generating a texture with alternating red and blue rows.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: LoadRawTextureData

Сообщение DbIMok 22 янв 2014, 20:02

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: LoadRawTextureData

Сообщение seaman 22 янв 2014, 20:24

Т.е. чтобы загруженная текстура отображалась не вверх ногами ее нужно предварительно перевернуть?
Но это по моему не объясняет почему у топикастера текстура нормально не грузится. Или я чего то не понял?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: LoadRawTextureData

Сообщение DbIMok 22 янв 2014, 20:26

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: LoadRawTextureData

Сообщение seaman 22 янв 2014, 21:24

Отличный пример. В-общем ясно что кнопки "Сделать круто" не появилось. Можно загрузить любую текстуру, но нужно разобрать ее формат. С dxt это не так и просто. Но возможность есть.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: LoadRawTextureData

Сообщение [bm] 23 янв 2014, 08:36

Ха ха! Забыл выполнить Apply() на текстуре после загрузки :)

Всем спасибо за полезные ссылки и код. В итоге получил в 100 раз быстрее загрузку текстуры и меньше требуемой памяти, в отличии от загрузки шифрованного бандла в память, создание бандла из памяти, и загрузки из бандла текстуры.

сравнение времени на загрузку:

загрузка текстуры из зашифрованного бандла: 0.416488
загрузка зашифрованной dds без мипмап: 0.00722605
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: LoadRawTextureData

Сообщение jetyb 23 янв 2014, 09:41

Шифрованного бандла - то есть сжатого?
Сравнение со сжатым бандлом не слишком корректное - там еще время на распаковку данных тратится. И размер данных поменьше (время загрузки побыстрее).
Интересно посмотреть сравнение времени выполнения и размера файла текстуры для сжатого, несжатого бандлов и RawTextureData
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: LoadRawTextureData

Сообщение seaman 24 янв 2014, 07:52

Вопрос к топикастеру. У Вас четко прописаны размеры текстуры. Если написать неверные - грузится неверно. Нет ли какого простого решения определить размеры текстуры из считанного массива байт? Можно, конечно разобрать загрузку в существующих библиотеках, но может уже есть готовое решение?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: LoadRawTextureData

Сообщение Neyl 24 янв 2014, 10:19

seaman писал(а):Нет ли какого простого решения определить размеры текстуры из считанного массива байт?


Можно так определить
Синтаксис:
Используется csharp
var bytes = File.ReadAllBytes(ddspath);
int height = BitConverter.ToInt32(bytes, 12);
int width = BitConverter.ToInt32(bytes, 16);
var txt = new Texture2D(width, height, TextureFormat.DXT1, false);
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17

Re: LoadRawTextureData

Сообщение seaman 24 янв 2014, 13:12

Да, я уже нашел. Еще нужно определять DXT1/5 что тоже легко сделать (смещение +84)
Для полного счастья хорошо бы еще загружать DXT2/3/4. В Юнити их нет. Как я понял 2/4 аналоги 3/5 и загружать их надо также. Только отображать хорошо бы по иному (у них premultiplied alpha). Т.е. осталось только научиться загружать DXT3.
Может кто подскажет - возможно ли это сделать также просто.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: LoadRawTextureData

Сообщение seaman 24 янв 2014, 14:57

Еще какая-то фигня. У всех текстур сдвиг:
Изображение
PS^ а DXT3 нормально грузится если указываешь DXT5 ;)
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

След.

Вернуться в Скрипты

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

Сейчас этот форум просматривают: Google [Bot] и гости: 6