Я хочу посмотреть на .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()
, готовы к переходу в графический процессор.
Как преобразовать этот код, чтобы можно было считывать каждый пиксель, каждую строку текстуры?