mirror of
https://github.com/overte-org/overte.git
synced 2025-08-04 02:43:32 +02:00
Add support for the R8 textures
This commit is contained in:
parent
ba54b5ce11
commit
5e307f247e
6 changed files with 51 additions and 13 deletions
|
@ -17,6 +17,7 @@ GLenum GLTexelFormat::evalGLTexelFormatInternal(const gpu::Element& dstFormat) {
|
||||||
switch (dstFormat.getDimension()) {
|
switch (dstFormat.getDimension()) {
|
||||||
case gpu::SCALAR: {
|
case gpu::SCALAR: {
|
||||||
switch (dstFormat.getSemantic()) {
|
switch (dstFormat.getSemantic()) {
|
||||||
|
case gpu::RED:
|
||||||
case gpu::RGB:
|
case gpu::RGB:
|
||||||
case gpu::RGBA:
|
case gpu::RGBA:
|
||||||
case gpu::SRGB:
|
case gpu::SRGB:
|
||||||
|
@ -262,6 +263,7 @@ GLTexelFormat GLTexelFormat::evalGLTexelFormat(const Element& dstFormat, const E
|
||||||
texel.type = ELEMENT_TYPE_TO_GL[dstFormat.getType()];
|
texel.type = ELEMENT_TYPE_TO_GL[dstFormat.getType()];
|
||||||
|
|
||||||
switch (dstFormat.getSemantic()) {
|
switch (dstFormat.getSemantic()) {
|
||||||
|
case gpu::RED:
|
||||||
case gpu::RGB:
|
case gpu::RGB:
|
||||||
case gpu::RGBA:
|
case gpu::RGBA:
|
||||||
texel.internalFormat = GL_R8;
|
texel.internalFormat = GL_R8;
|
||||||
|
@ -403,6 +405,7 @@ GLTexelFormat GLTexelFormat::evalGLTexelFormat(const Element& dstFormat, const E
|
||||||
texel.internalFormat = GL_COMPRESSED_RED_RGTC1;
|
texel.internalFormat = GL_COMPRESSED_RED_RGTC1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case gpu::RED:
|
||||||
case gpu::RGB:
|
case gpu::RGB:
|
||||||
case gpu::RGBA:
|
case gpu::RGBA:
|
||||||
case gpu::SRGB:
|
case gpu::SRGB:
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
using namespace gpu;
|
using namespace gpu;
|
||||||
|
|
||||||
|
const Element Element::COLOR_R_8 { SCALAR, NUINT8, RED };
|
||||||
|
|
||||||
const Element Element::COLOR_RGBA_32{ VEC4, NUINT8, RGBA };
|
const Element Element::COLOR_RGBA_32{ VEC4, NUINT8, RGBA };
|
||||||
const Element Element::COLOR_SRGBA_32{ VEC4, NUINT8, SRGBA };
|
const Element Element::COLOR_SRGBA_32{ VEC4, NUINT8, SRGBA };
|
||||||
|
|
||||||
|
|
|
@ -133,6 +133,7 @@ static const int SCALAR_COUNT[NUM_DIMENSIONS] = {
|
||||||
enum Semantic {
|
enum Semantic {
|
||||||
RAW = 0, // used as RAW memory
|
RAW = 0, // used as RAW memory
|
||||||
|
|
||||||
|
RED,
|
||||||
RGB,
|
RGB,
|
||||||
RGBA,
|
RGBA,
|
||||||
BGRA,
|
BGRA,
|
||||||
|
@ -227,6 +228,7 @@ public:
|
||||||
return getRaw() != right.getRaw();
|
return getRaw() != right.getRaw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const Element COLOR_R_8;
|
||||||
static const Element COLOR_RGBA_32;
|
static const Element COLOR_RGBA_32;
|
||||||
static const Element COLOR_SRGBA_32;
|
static const Element COLOR_SRGBA_32;
|
||||||
static const Element COLOR_BGRA_32;
|
static const Element COLOR_BGRA_32;
|
||||||
|
|
|
@ -20,13 +20,18 @@ ktx::KTXUniquePointer Texture::serialize(const Texture& texture) {
|
||||||
|
|
||||||
// From texture format to ktx format description
|
// From texture format to ktx format description
|
||||||
auto texelFormat = texture.getTexelFormat();
|
auto texelFormat = texture.getTexelFormat();
|
||||||
if ( !( (texelFormat == Format::COLOR_RGBA_32)
|
auto mipFormat = texture.getStoredMipFormat();
|
||||||
|| (texelFormat == Format::COLOR_SRGBA_32)
|
|
||||||
))
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
header.setUncompressed(ktx::GLType::UNSIGNED_BYTE, 4, ktx::GLFormat::BGRA, ktx::GLInternalFormat_Uncompressed::RGBA8, ktx::GLBaseInternalFormat::RGBA);
|
|
||||||
|
|
||||||
|
if (texelFormat == Format::COLOR_RGBA_32 && mipFormat == Format::COLOR_BGRA_32) {
|
||||||
|
header.setUncompressed(ktx::GLType::UNSIGNED_BYTE, 4, ktx::GLFormat::BGRA, ktx::GLInternalFormat_Uncompressed::RGBA8, ktx::GLBaseInternalFormat::RGBA);
|
||||||
|
} else if (texelFormat == Format::COLOR_SRGBA_32 && mipFormat == Format::COLOR_BGRA_32) {
|
||||||
|
header.setUncompressed(ktx::GLType::UNSIGNED_BYTE, 4, ktx::GLFormat::BGRA, ktx::GLInternalFormat_Uncompressed::SRGB8_ALPHA8, ktx::GLBaseInternalFormat::RGBA);
|
||||||
|
} else if (texelFormat == Format::COLOR_R_8 && mipFormat == Format::COLOR_R_8) {
|
||||||
|
header.setUncompressed(ktx::GLType::UNSIGNED_BYTE, 1, ktx::GLFormat::RED, ktx::GLInternalFormat_Uncompressed::R8, ktx::GLBaseInternalFormat::RED);
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Set Dimensions
|
// Set Dimensions
|
||||||
uint32_t numFaces = 1;
|
uint32_t numFaces = 1;
|
||||||
switch (texture.getType()) {
|
switch (texture.getType()) {
|
||||||
|
@ -97,9 +102,27 @@ Texture* Texture::unserialize(Usage usage, TextureUsageType usageType, const ktx
|
||||||
}
|
}
|
||||||
const auto& header = *srcData->getHeader();
|
const auto& header = *srcData->getHeader();
|
||||||
|
|
||||||
Format mipFormat = Format::COLOR_SBGRA_32;
|
Format mipFormat = Format::COLOR_BGRA_32;
|
||||||
Format texelFormat = Format::COLOR_SRGBA_32;
|
Format texelFormat = Format::COLOR_SRGBA_32;
|
||||||
|
|
||||||
|
if (header.getGLFormat() == ktx::GLFormat::BGRA && header.getGLType() == ktx::GLType::UNSIGNED_BYTE && header.getTypeSize() == 4) {
|
||||||
|
mipFormat = Format::COLOR_BGRA_32;
|
||||||
|
if (header.getGLInternaFormat_Uncompressed() == ktx::GLInternalFormat_Uncompressed::RGBA8) {
|
||||||
|
texelFormat = Format::COLOR_RGBA_32;
|
||||||
|
} else if (header.getGLInternaFormat_Uncompressed() == ktx::GLInternalFormat_Uncompressed::SRGB8_ALPHA8) {
|
||||||
|
texelFormat = Format::COLOR_SRGBA_32;
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
} else if (header.getGLFormat() == ktx::GLFormat::RED && header.getGLType() == ktx::GLType::UNSIGNED_BYTE && header.getTypeSize() == 1) {
|
||||||
|
mipFormat = Format::COLOR_R_8;
|
||||||
|
if (header.getGLInternaFormat_Uncompressed() == ktx::GLInternalFormat_Uncompressed::R8) {
|
||||||
|
texelFormat = Format::COLOR_R_8;
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Find Texture Type based on dimensions
|
// Find Texture Type based on dimensions
|
||||||
Type type = TEX_1D;
|
Type type = TEX_1D;
|
||||||
if (header.pixelWidth == 0) {
|
if (header.pixelWidth == 0) {
|
||||||
|
|
|
@ -394,6 +394,14 @@ namespace ktx {
|
||||||
glBaseInternalFormat = (uint32_t) baseInternalFormat;
|
glBaseInternalFormat = (uint32_t) baseInternalFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLType getGLType() const { return (GLType)glType; }
|
||||||
|
uint32_t getTypeSize() const { return glTypeSize; }
|
||||||
|
GLFormat getGLFormat() const { return (GLFormat)glFormat; }
|
||||||
|
GLInternalFormat_Uncompressed getGLInternaFormat_Uncompressed() const { return (GLInternalFormat_Uncompressed)glInternalFormat; }
|
||||||
|
GLInternalFormat_Compressed getGLInternaFormat_Compressed() const { return (GLInternalFormat_Compressed)glInternalFormat; }
|
||||||
|
GLBaseInternalFormat getGLBaseInternalFormat() const { return (GLBaseInternalFormat)glBaseInternalFormat; }
|
||||||
|
|
||||||
|
|
||||||
void setDimensions(uint32_t width, uint32_t height = 0, uint32_t depth = 0, uint32_t numSlices = 0, uint32_t numFaces = 1) {
|
void setDimensions(uint32_t width, uint32_t height = 0, uint32_t depth = 0, uint32_t numSlices = 0, uint32_t numFaces = 1) {
|
||||||
pixelWidth = (width > 0 ? width : 1);
|
pixelWidth = (width > 0 ? width : 1);
|
||||||
pixelHeight = height;
|
pixelHeight = height;
|
||||||
|
|
|
@ -504,9 +504,9 @@ gpu::Texture* TextureUsage::createRoughnessTextureFromImage(const QImage& srcIma
|
||||||
#ifdef COMPRESS_TEXTURES
|
#ifdef COMPRESS_TEXTURES
|
||||||
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::COMPRESSED_R);
|
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::COMPRESSED_R);
|
||||||
#else
|
#else
|
||||||
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB);
|
gpu::Element formatGPU = gpu::Element::COLOR_R_8;
|
||||||
#endif
|
#endif
|
||||||
gpu::Element formatMip = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB);
|
gpu::Element formatMip = gpu::Element::COLOR_R_8;
|
||||||
|
|
||||||
theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)));
|
theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)));
|
||||||
theTexture->setSource(srcImageName);
|
theTexture->setSource(srcImageName);
|
||||||
|
@ -545,9 +545,9 @@ gpu::Texture* TextureUsage::createRoughnessTextureFromGlossImage(const QImage& s
|
||||||
#ifdef COMPRESS_TEXTURES
|
#ifdef COMPRESS_TEXTURES
|
||||||
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::COMPRESSED_R);
|
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::COMPRESSED_R);
|
||||||
#else
|
#else
|
||||||
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB);
|
gpu::Element formatGPU = gpu::Element::COLOR_R_8;
|
||||||
#endif
|
#endif
|
||||||
gpu::Element formatMip = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB);
|
gpu::Element formatMip = gpu::Element::COLOR_R_8;
|
||||||
|
|
||||||
theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)));
|
theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)));
|
||||||
theTexture->setSource(srcImageName);
|
theTexture->setSource(srcImageName);
|
||||||
|
@ -583,9 +583,9 @@ gpu::Texture* TextureUsage::createMetallicTextureFromImage(const QImage& srcImag
|
||||||
#ifdef COMPRESS_TEXTURES
|
#ifdef COMPRESS_TEXTURES
|
||||||
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::COMPRESSED_R);
|
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::COMPRESSED_R);
|
||||||
#else
|
#else
|
||||||
gpu::Element formatGPU = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB);
|
gpu::Element formatGPU = gpu::Element::COLOR_R_8;
|
||||||
#endif
|
#endif
|
||||||
gpu::Element formatMip = gpu::Element(gpu::SCALAR, gpu::NUINT8, gpu::RGB);
|
gpu::Element formatMip = gpu::Element::COLOR_R_8;
|
||||||
|
|
||||||
theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)));
|
theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)));
|
||||||
theTexture->setSource(srcImageName);
|
theTexture->setSource(srcImageName);
|
||||||
|
|
Loading…
Reference in a new issue