Skip to content

Commit 168b1e5

Browse files
committed
fix: compute RGB(A) mipmaps with stb sRGB for now
Mipmaps computed with `gli::generate_mipmaps` are a bit too dim and unreadable at mid to far zoom levels. Use sRGB-based resizing with `stb_image_resize` for now and revisit colour spaces later.
1 parent 38f56a9 commit 168b1e5

1 file changed

Lines changed: 14 additions & 2 deletions

File tree

engine/render/r_texture.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,21 @@ std::unique_ptr<image_c> r_tex_c::BuildMipSet(std::unique_ptr<image_c> img)
441441
const auto layers = img->tex.layers();
442442
const auto swizzles = img->tex.swizzles();
443443
auto newTex = gli::texture2d_array(format, extent, layers, swizzles);
444-
for (size_t layer = 0; layer < layers; ++layer)
444+
for (size_t layer = 0; layer < layers; ++layer) {
445445
newTex.copy(img->tex, layer, 0, 0, layer, 0, 0);
446-
newTex = gli::generate_mipmaps(newTex, gli::FILTER_LINEAR);
446+
const size_t levels = newTex.levels();
447+
for (size_t level = 1; level < levels; ++level) {
448+
const auto srcExtent = newTex.extent(level - 1);
449+
const auto comp = gli::component_count(format);
450+
const auto dstExtent = newTex.extent(level);
451+
const bool hasAlpha = comp == 4;
452+
stbir_resize_uint8_srgb_edgemode(
453+
newTex.data<uint8_t>(layer, 0, level - 1), srcExtent.x, srcExtent.y, srcExtent.x * comp,
454+
newTex.data<uint8_t>(layer, 0, level), dstExtent.x, dstExtent.y, dstExtent.x * comp,
455+
comp, hasAlpha ? 3 : STBIR_ALPHA_CHANNEL_NONE, 0, STBIR_EDGE_CLAMP);
456+
}
457+
}
458+
//newTex = gli::generate_mipmaps(newTex, gli::FILTER_LINEAR);
447459
img->tex = newTex;
448460
}
449461
}

0 commit comments

Comments
 (0)