Страница 1 из 2

LoadRawTextureData [РЕШЕНО]

СообщениеДобавлено: 22 янв 2014, 16:35
[bm]
У кого-нибудь получилось загрузить текстуру таким методом? Texture2D.LoadRawTextureData

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

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


FIXED: забыл применить Apply() после загрузки текстуры

Re: LoadRawTextureData

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

Re: LoadRawTextureData

СообщениеДобавлено: 22 янв 2014, 19:05
BornFoRdeatH
В гугле второе по списку

Синтаксис:
Используется 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.

Re: LoadRawTextureData

СообщениеДобавлено: 22 янв 2014, 19:16
seaman
Пример не понятен. То что формируется в массиве data - уж точно не dxt. Возможно PVRTC, но тоже что-то не верится.
Если это грузит dds текстуры - это класс!!!
Блин, когда уже нормальная документация будет...

Re: LoadRawTextureData

СообщениеДобавлено: 22 янв 2014, 19:25
BornFoRdeatH
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.

Re: LoadRawTextureData

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

Re: LoadRawTextureData

СообщениеДобавлено: 22 янв 2014, 20:24
seaman
Т.е. чтобы загруженная текстура отображалась не вверх ногами ее нужно предварительно перевернуть?
Но это по моему не объясняет почему у топикастера текстура нормально не грузится. Или я чего то не понял?

Re: LoadRawTextureData

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

Re: LoadRawTextureData

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

Re: LoadRawTextureData

СообщениеДобавлено: 23 янв 2014, 08:36
[bm]
Ха ха! Забыл выполнить Apply() на текстуре после загрузки :)

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

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

загрузка текстуры из зашифрованного бандла: 0.416488
загрузка зашифрованной dds без мипмап: 0.00722605

Re: LoadRawTextureData

СообщениеДобавлено: 23 янв 2014, 09:41
jetyb
Шифрованного бандла - то есть сжатого?
Сравнение со сжатым бандлом не слишком корректное - там еще время на распаковку данных тратится. И размер данных поменьше (время загрузки побыстрее).
Интересно посмотреть сравнение времени выполнения и размера файла текстуры для сжатого, несжатого бандлов и RawTextureData

Re: LoadRawTextureData

СообщениеДобавлено: 24 янв 2014, 07:52
seaman
Вопрос к топикастеру. У Вас четко прописаны размеры текстуры. Если написать неверные - грузится неверно. Нет ли какого простого решения определить размеры текстуры из считанного массива байт? Можно, конечно разобрать загрузку в существующих библиотеках, но может уже есть готовое решение?

Re: LoadRawTextureData

СообщениеДобавлено: 24 янв 2014, 10:19
Neyl
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);

Re: LoadRawTextureData

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

Re: LoadRawTextureData

СообщениеДобавлено: 24 янв 2014, 14:57
seaman
Еще какая-то фигня. У всех текстур сдвиг:
Изображение
PS^ а DXT3 нормально грузится если указываешь DXT5 ;)