Added some support for uncompressed texture for ktx

pull/324/head
sindra 4 years ago
parent eb34681ce8
commit b4eb9c5972

@ -540,6 +540,67 @@ void Compressor::Private::quantize(Surface & img, const CompressionOptions::Priv
}
}
namespace
{
enum
{
// internal format
GL_RGB8 = 0x8051,
GL_RGBA8 = 0x8058,
GL_R16 = 0x822A,
GL_RGBA16F = 0x881A,
GL_R11F_G11F_B10F = 0x8C3A,
// type
GL_UNSIGNED_BYTE = 0x1401,
GL_HALF_FLOAT = 0x140B,
GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B,
GL_UNSIGNED_SHORT = 0x1403,
// format
GL_RED = 0x1903,
GL_RGB = 0x1907,
GL_RGBA = 0x1908,
GL_BGR = 0x80E0,
GL_BGRA = 0x80E1,
};
struct GLFormatDescriptor
{
uint glFormat; // for uncompressed texture glBaseInternalFormat == glFormat
uint glInternalFormat;
uint glType;
uint glTypeSize;
RGBAPixelFormat pixelFormat;
};
static const GLFormatDescriptor s_glFormats[] =
{
{ GL_BGR, GL_RGB8, GL_UNSIGNED_BYTE, 1, { 24, 0xFF0000, 0xFF00, 0xFF, 0 } },
{ GL_BGRA, GL_RGBA8, GL_UNSIGNED_BYTE, 1, { 32, 0xFF0000, 0xFF00, 0xFF, 0xFF000000 } },
{ GL_RGBA, GL_RGBA8, GL_UNSIGNED_BYTE, 1, { 32, 0xFF, 0xFF00, 0xFF0000, 0xFF000000 } },
};
static const uint s_glFormatCount = NV_ARRAY_SIZE(s_glFormats);
static const GLFormatDescriptor* findGLFormat(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask)
{
for (int i = 0; i < s_glFormatCount; i++)
{
if (s_glFormats[i].pixelFormat.bitcount == bitcount &&
s_glFormats[i].pixelFormat.rmask == rmask &&
s_glFormats[i].pixelFormat.gmask == gmask &&
s_glFormats[i].pixelFormat.bmask == bmask &&
s_glFormats[i].pixelFormat.amask == amask)
{
return &s_glFormats[i];
}
}
return nullptr;
}
}
bool Compressor::Private::outputHeader(nvtt::TextureType textureType, int w, int h, int d, int arraySize, int mipmapCount, bool isNormalMap, const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) const
{
if (w <= 0 || h <= 0 || d <= 0 || arraySize <= 0 || mipmapCount <= 0)
@ -840,12 +901,53 @@ bool Compressor::Private::outputHeader(nvtt::TextureType textureType, int w, int
bool supported = true;
// TODO non-compressed formats
if (compressionOptions.format == Format_RGBA)
{
//header.glType = ?;
//header.glTypeSize = ?;
//header.glFormat = ?;
const uint bitcount = compressionOptions.getBitCount();
if (compressionOptions.pixelType == PixelType_Float) {
if (compressionOptions.rsize == 16 && compressionOptions.gsize == 16 && compressionOptions.bsize == 16 && compressionOptions.asize == 16) {
header.glType = GL_HALF_FLOAT;
header.glTypeSize = 2;
header.glFormat = GL_RGBA;
header.glInternalFormat = GL_RGBA16F;
header.glBaseInternalFormat = GL_RGBA;
}
else if (compressionOptions.rsize == 11 && compressionOptions.gsize == 11 && compressionOptions.bsize == 10 && compressionOptions.asize == 0) {
header.glType = GL_UNSIGNED_INT_10F_11F_11F_REV;
header.glTypeSize = 4;
header.glFormat = GL_RGB;
header.glInternalFormat = GL_R11F_G11F_B10F;
header.glBaseInternalFormat = GL_RGB;
}
else {
supported = false;
}
}
else {
if (bitcount == 16 && compressionOptions.rsize == 16) {
header.glType = GL_UNSIGNED_SHORT;
header.glTypeSize = 2;
header.glFormat = GL_RED;
header.glInternalFormat = GL_R16;
header.glBaseInternalFormat = GL_RED;
}
else {
const GLFormatDescriptor* glFormatDesc = findGLFormat(compressionOptions.bitcount, compressionOptions.rmask, compressionOptions.gmask, compressionOptions.bmask, compressionOptions.amask);
if (glFormatDesc) {
header.glType = glFormatDesc->glType;
header.glTypeSize = glFormatDesc->glTypeSize;
header.glFormat = glFormatDesc->glFormat;
header.glInternalFormat = glFormatDesc->glInternalFormat;
header.glBaseInternalFormat = header.glFormat;
}
else {
supported = false;
}
}
}
}
else
{

Loading…
Cancel
Save