From f0c63bac7ad16b1ba565a64d631cc344da4f9d0f Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 20 Jun 2022 22:11:50 +0300 Subject: [PATCH] Support loading sRGB textures --- libs/gfx/include/psemek/gfx/pixel.hpp | 21 +++++++++++++++++++++ libs/gfx/include/psemek/gfx/texture.hpp | 23 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/libs/gfx/include/psemek/gfx/pixel.hpp b/libs/gfx/include/psemek/gfx/pixel.hpp index fd89d596..07629a79 100644 --- a/libs/gfx/include/psemek/gfx/pixel.hpp +++ b/libs/gfx/include/psemek/gfx/pixel.hpp @@ -33,6 +33,9 @@ namespace psemek::gfx template struct integer; + template + struct srgb; + template struct pixel_traits; @@ -70,6 +73,24 @@ namespace psemek::gfx static constexpr GLenum type = gl::UNSIGNED_BYTE; }; + // Normalized 8-bit sRGB + + template <> + struct pixel_traits>> + { + static constexpr GLenum internal_format = gl::SRGB8; + static constexpr GLenum format = gl::RGB; + static constexpr GLenum type = gl::UNSIGNED_BYTE; + }; + + template <> + struct pixel_traits>> + { + static constexpr GLenum internal_format = gl::SRGB8_ALPHA8; + static constexpr GLenum format = gl::RGBA; + static constexpr GLenum type = gl::UNSIGNED_BYTE; + }; + // Normalized 10-bit template <> diff --git a/libs/gfx/include/psemek/gfx/texture.hpp b/libs/gfx/include/psemek/gfx/texture.hpp index 5c56764e..d76e1987 100644 --- a/libs/gfx/include/psemek/gfx/texture.hpp +++ b/libs/gfx/include/psemek/gfx/texture.hpp @@ -47,9 +47,15 @@ namespace psemek::gfx template void load(geom::vector const & size, Pixel const * data = nullptr); + template + void load_srgb(geom::vector const & size, Pixel const * data = nullptr); + template void load(util::array const & p); + template + void load_srgb(util::array const & p); + void pixels(GLenum format, GLenum type, void * data, int layer = 0) const; template @@ -278,6 +284,14 @@ namespace psemek::gfx load(traits::internal_format, size, traits::format, traits::type, data); } + template + template + void basic_texture::load_srgb(geom::vector const & size, Pixel const * data) + { + using traits = pixel_traits>; + load(traits::internal_format, size, traits::format, traits::type, data); + } + template template void basic_texture::load(util::array const & p) @@ -287,6 +301,15 @@ namespace psemek::gfx load(size, p.data()); } + template + template + void basic_texture::load_srgb(util::array const & p) + { + geom::vector size; + for (std::size_t i = 0; i < D; ++i) size[i] = p.dim(i); + load_srgb(size, p.data()); + } + template void basic_texture::pixels(GLenum format, GLenum type, void * data, int layer) const {