Skip to content

Commit

Permalink
Fix floating point texture usage (#5438)
Browse files Browse the repository at this point in the history
  • Loading branch information
errissa authored Aug 17, 2022
1 parent da98405 commit 7bf8469
Showing 1 changed file with 33 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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: {}",
Expand Down Expand Up @@ -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(),
Expand All @@ -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;
}

Expand All @@ -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() *
Expand All @@ -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,
Expand All @@ -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;
}
}
Expand Down

0 comments on commit 7bf8469

Please sign in to comment.