diff --git a/libs/gfx/include/psemek/gfx/texture.hpp b/libs/gfx/include/psemek/gfx/texture.hpp index 186de1b0..45e5f637 100644 --- a/libs/gfx/include/psemek/gfx/texture.hpp +++ b/libs/gfx/include/psemek/gfx/texture.hpp @@ -103,6 +103,9 @@ namespace psemek::gfx } void generate_mipmap(); + void nearest_filter(); + void linear_filter(); + void anisotropy(); private: GLuint id_; diff --git a/libs/gfx/source/texture.cpp b/libs/gfx/source/texture.cpp index 73764789..5c0b4f58 100644 --- a/libs/gfx/source/texture.cpp +++ b/libs/gfx/source/texture.cpp @@ -1,4 +1,5 @@ #include +#include namespace psemek::gfx { @@ -56,7 +57,6 @@ namespace psemek::gfx { bind(); gl::TexImage2D(gl::TEXTURE_2D, 0, internal_format, width, height, 0, format, type, data); - gl::GenerateMipmap(gl::TEXTURE_2D); width_ = width; height_ = height; @@ -81,4 +81,31 @@ namespace psemek::gfx gl::GenerateMipmap(gl::TEXTURE_2D); } + void texture_2d::nearest_filter() + { + bind(); + gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST); + gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR_MIPMAP_LINEAR); + } + + void texture_2d::linear_filter() + { + bind(); + gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEAR); + gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR_MIPMAP_LINEAR); + } + + void texture_2d::anisotropy() + { + if (!gl::exts::var_EXT_texture_filter_anisotropic) return; + + static std::optional level; + if (!level) + { + level = 0; + gl::GetFloatv(gl::MAX_TEXTURE_MAX_ANISOTROPY_EXT, &(*level)); + } + gl::TexParameterf(gl::TEXTURE_2D, gl::TEXTURE_MAX_ANISOTROPY_EXT, *level); + } + }