Как посмотреть внутри .ktx текстуры? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу посмотреть на .ktx текстуры.Под этим я подразумеваю получить текстуру, открыть ее в каком-нибудь текстовом редакторе и просто посмотреть, что внутри нее.Это, конечно, очень простой пример, я думаю, мне нужно немного больше, чем просто открыть текстовый редактор.

Сейчас я знаю, как читать данные текстуры и отправлять их в графический процессор.

struct Header
{
    unsigned char identifier[12];
    unsigned int endianness;
    unsigned int gltype;
    unsigned int gltypesize;
    unsigned int glformat;
    unsigned int glinternalformat;
    unsigned int glbaseinternalformat;
    unsigned int pixelwidth;
    unsigned int pixelheight;
    unsigned int pixeldepth;
    unsigned int arrayelements;
    unsigned int faces;
    unsigned int miplevels;
    unsigned int keypairbytes;
};


static const unsigned char identifier[] =
{
    0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A
};

static const unsigned int swap32(const unsigned int u32)
{
    union
    {
        unsigned int u32;
        unsigned char u8[4];
    } a, b;

    a.u32 = u32;
    b.u8[0] = a.u8[3];
    b.u8[1] = a.u8[2];
    b.u8[2] = a.u8[1];
    b.u8[3] = a.u8[0];

    return b.u32;
}

unsigned char* LoadKTX(const std::string& filePath)
{
    FILE* file = nullptr;
    fopen_s(&file, filePath.c_str(), "rb");
    if (!file) { return nullptr; }

    Header header;

    fread_s(&header, sizeof(header), sizeof(header), 1, file);

    if (memcmp(header.identifier, identifier, sizeof(identifier)) != 0) {
        std::cout << "Bad identifier\n";
    }

    if (header.endianness == 0x04030201) {
        // Zamiana nie jest konieczna.
    } else if (header.endianness == 0x01020304) {
        // Konieczna zamiana
        header.endianness = swap32(header.endianness);
        header.gltype = swap32(header.gltype);
        header.gltypesize = swap32(header.gltypesize);
        header.glformat = swap32(header.glformat);
        header.glinternalformat = swap32(header.glinternalformat);
        header.glbaseinternalformat = swap32(header.glbaseinternalformat);
        header.pixelwidth = swap32(header.pixelwidth);
        header.pixelheight = swap32(header.pixelheight);
        header.pixeldepth = swap32(header.pixeldepth);
        header.arrayelements = swap32(header.arrayelements);
        header.faces = swap32(header.faces);
        header.miplevels = swap32(header.miplevels);
        header.keypairbytes = swap32(header.keypairbytes);
    }

    size_t startData = ftell(file) + header.keypairbytes;
    fseek(file, 0, SEEK_END);
    size_t endData = ftell(file);
    fseek(file, startData, SEEK_SET);

    unsigned char* data = new unsigned char[endData - startData];
    std::memset(data, 0, endData - startData);
    fread_s(data, endData - startData, 1, endData - startData, file);

    return data;
}

Данные, возвращаемые функцией LoadKTX(), готовы к переходу в графический процессор.

Как преобразовать этот код, чтобы можно было считывать каждый пиксель, каждую строку текстуры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...