From 7bf8469d8fa8d632d801b9503a1cc99813a9445b Mon Sep 17 00:00:00 2001 From: Rene Date: Wed, 17 Aug 2022 10:05:04 -0400 Subject: [PATCH] Fix floating point texture usage (#5438) --- .../filament/FilamentResourceManager.cpp | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp b/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp index 847055dbc7b..54f61ad1150 100644 --- a/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp +++ b/cpp/open3d/visualization/rendering/filament/FilamentResourceManager.cpp @@ -231,24 +231,34 @@ void FormatSettingsFromImage(TextureSettings& settings, {(2 << 4 | 1), filament::Texture::InternalFormat::R16UI}, {(2 << 4 | 2), filament::Texture::InternalFormat::RG16UI}, {(2 << 4 | 3), filament::Texture::InternalFormat::RGB16UI}, + {(2 << 4 | 4), filament::Texture::InternalFormat::RGBA16UI}, {(1 << 4 | 1), filament::Texture::InternalFormat::R8}, {(1 << 4 | 2), filament::Texture::InternalFormat::RG8}, {(1 << 4 | 3), filament::Texture::InternalFormat::RGB8}, {(1 << 4 | 4), filament::Texture::InternalFormat::RGBA8}}; // Set image format + bool int_format = (bytes_per_channel == 2); switch (num_channels) { case 1: - settings.image_format = filament::Texture::Format::R; + settings.image_format = + (int_format ? filament::Texture::Format::R_INTEGER + : filament::Texture::Format::R); break; case 2: - settings.image_format = filament::Texture::Format::RG; + settings.image_format = + (int_format ? filament::Texture::Format::RG_INTEGER + : filament::Texture::Format::RG); break; case 3: - settings.image_format = filament::Texture::Format::RGB; + settings.image_format = + (int_format ? filament::Texture::Format::RGB_INTEGER + : filament::Texture::Format::RGB); break; case 4: - settings.image_format = filament::Texture::Format::RGBA; + settings.image_format = + (int_format ? filament::Texture::Format::RGBA_INTEGER + : filament::Texture::Format::RGBA); break; default: utility::LogError("Unsupported image number of channels: {}", @@ -878,6 +888,11 @@ filament::Texture* FilamentResourceManager::LoadTextureFromImage( auto texture_settings = GetSettingsFromImage(*image, srgb); auto levels = maxLevelCount(texture_settings.texel_width, texture_settings.texel_height); + bool mipmappable = + (texture_settings.image_type == filament::Texture::Type::UBYTE); + if (!mipmappable) { + levels = 1; + } Texture::PixelBufferDescriptor pb( image->data_.data(), image->data_.size(), @@ -892,7 +907,9 @@ filament::Texture* FilamentResourceManager::LoadTextureFromImage( .build(engine_); texture->setImage(engine_, 0, std::move(pb)); - texture->generateMipmaps(engine_); + if (mipmappable) { + texture->generateMipmaps(engine_); + } return texture; } @@ -903,6 +920,11 @@ filament::Texture* FilamentResourceManager::LoadTextureFromImage( auto texture_settings = GetSettingsFromImage(image, srgb); auto levels = maxLevelCount(texture_settings.texel_width, texture_settings.texel_height); + // Float textures cannot be mipmapped + bool mipmappable = (image.GetDtype() == core::Dtype::UInt8); + if (mipmappable) { + levels = 1; + } const size_t image_bytes = image.GetRows() * image.GetCols() * image.GetChannels() * @@ -922,7 +944,9 @@ filament::Texture* FilamentResourceManager::LoadTextureFromImage( .sampler(Texture::Sampler::SAMPLER_2D) .build(engine_); texture->setImage(engine_, 0, std::move(pb)); - texture->generateMipmaps(engine_); + if (mipmappable) { + texture->generateMipmaps(engine_); + } return texture; } else { Texture::PixelBufferDescriptor pb(image.GetDataPtr(), image_bytes, @@ -936,7 +960,9 @@ filament::Texture* FilamentResourceManager::LoadTextureFromImage( .sampler(Texture::Sampler::SAMPLER_2D) .build(engine_); texture->setImage(engine_, 0, std::move(pb)); - texture->generateMipmaps(engine_); + if (mipmappable) { + texture->generateMipmaps(engine_); + } return texture; } }