From a835fb98015ff73f18fd49108b46c375a8787021 Mon Sep 17 00:00:00 2001 From: Harrand Date: Tue, 11 Oct 2022 01:40:15 +0100 Subject: [PATCH] + Added ResourceFlags ImageWrapClampEdge, ImageWrapRepeat and ImageWrapMirroredRepeat. Needs a documentation pass. Also need to implement ImageMipNearest and ImageMipLinear which currently do nothing (mainly because mips are not supported) --- demo/gl/tz_dynamic_triangle_demo.cpp | 3 ++- src/tz/gl/api/resource.hpp | 3 +++ src/tz/gl/impl/backend/ogl2/sampler.hpp | 7 ++++++- src/tz/gl/impl/frontend/ogl2/component.cpp | 24 +++++++++++++++++++--- src/tz/gl/impl/frontend/vk2/renderer.cpp | 24 +++++++++++++++++++--- 5 files changed, 53 insertions(+), 8 deletions(-) diff --git a/demo/gl/tz_dynamic_triangle_demo.cpp b/demo/gl/tz_dynamic_triangle_demo.cpp index e4c6d59967..b7a4f3333a 100644 --- a/demo/gl/tz_dynamic_triangle_demo.cpp +++ b/demo/gl/tz_dynamic_triangle_demo.cpp @@ -75,7 +75,8 @@ int main() .access = tz::gl::ResourceAccess::DynamicVariable, .flags = { - tz::gl::ResourceFlag::ImageFilterLinear + tz::gl::ResourceFlag::ImageFilterLinear, + tz::gl::ResourceFlag::ImageWrapRepeat } } ) diff --git a/src/tz/gl/api/resource.hpp b/src/tz/gl/api/resource.hpp index f365d7bb38..7787cd00ac 100644 --- a/src/tz/gl/api/resource.hpp +++ b/src/tz/gl/api/resource.hpp @@ -38,6 +38,9 @@ namespace tz::gl ImageMipNearest, /// - Indicates that a mip computed from the weighted average of the next and previous mip will be chosen. ImageMipLinear, + ImageWrapClampEdge, + ImageWrapRepeat, + ImageWrapMirroredRepeat }; using ResourceFlags = tz::EnumField; diff --git a/src/tz/gl/impl/backend/ogl2/sampler.hpp b/src/tz/gl/impl/backend/ogl2/sampler.hpp index dfedce0e8c..2261bab6a5 100644 --- a/src/tz/gl/impl/backend/ogl2/sampler.hpp +++ b/src/tz/gl/impl/backend/ogl2/sampler.hpp @@ -24,7 +24,12 @@ namespace tz::gl::ogl2 enum class AddressMode : GLint { /// - An imaginary line is drawn from the out-of-bounds-coordinate back to the edge of the sampled image. The colour of the texel that it meets is used. - ClampToEdge = GL_CLAMP_TO_EDGE + ClampToEdge = GL_CLAMP_TO_EDGE, + /// - The texcoord is essentially modulo'd with the image dimensions. + Repeat = GL_REPEAT, + /// - Just like Repeat, except mirrored. + MirroredRepeat = GL_MIRRORED_REPEAT + }; /** diff --git a/src/tz/gl/impl/frontend/ogl2/component.cpp b/src/tz/gl/impl/frontend/ogl2/component.cpp index 8114e4677a..2b9e310349 100644 --- a/src/tz/gl/impl/frontend/ogl2/component.cpp +++ b/src/tz/gl/impl/frontend/ogl2/component.cpp @@ -132,6 +132,7 @@ namespace tz::gl tz_assert(this->resource->get_type() == ResourceType::Image, "ImageComponent was provided a resource which was not an ImageResource. Please submit a bug report."); const ImageResource* img_res = static_cast(this->resource); ogl2::LookupFilter filter = ogl2::LookupFilter::Nearest; + ogl2::AddressMode mode = ogl2::AddressMode::ClampToEdge; #if TZ_DEBUG if(img_res->get_flags().contains({ResourceFlag::ImageFilterNearest, ResourceFlag::ImageFilterLinear})) { @@ -146,6 +147,23 @@ namespace tz::gl { filter = ogl2::LookupFilter::Linear; } + + if(img_res->get_flags().contains({ResourceFlag::ImageWrapClampEdge, ResourceFlag::ImageWrapRepeat, ResourceFlag::ImageWrapMirroredRepeat})) + { + tz_error("ResourceFlags included all 3 of ImageWrapClampEdge, ImageWrapRepeat and ImageWrapMirroredRepeat, all of which are mutually exclusive. Please submit a bug report."); + } + if(img_res->get_flags().contains(ResourceFlag::ImageWrapClampEdge)) + { + mode = ogl2::AddressMode::ClampToEdge; + } + if(img_res->get_flags().contains(ResourceFlag::ImageWrapRepeat)) + { + mode = ogl2::AddressMode::Repeat; + } + if(img_res->get_flags().contains(ResourceFlag::ImageWrapMirroredRepeat)) + { + mode = ogl2::AddressMode::MirroredRepeat; + } return {{ .format = to_ogl2(img_res->get_format()), @@ -154,9 +172,9 @@ namespace tz::gl { .min_filter = filter, .mag_filter = filter, - .address_mode_s = ogl2::AddressMode::ClampToEdge, - .address_mode_t = ogl2::AddressMode::ClampToEdge, - .address_mode_r = ogl2::AddressMode::ClampToEdge + .address_mode_s = mode, + .address_mode_t = mode, + .address_mode_r = mode } }}; } diff --git a/src/tz/gl/impl/frontend/vk2/renderer.cpp b/src/tz/gl/impl/frontend/vk2/renderer.cpp index eb475fe002..35a9b59b8d 100644 --- a/src/tz/gl/impl/frontend/vk2/renderer.cpp +++ b/src/tz/gl/impl/frontend/vk2/renderer.cpp @@ -36,6 +36,7 @@ namespace tz::gl { vk2::LookupFilter filter = vk2::LookupFilter::Nearest; vk2::MipLookupFilter mip_filter = vk2::MipLookupFilter::Nearest; + vk2::SamplerAddressMode mode = vk2::SamplerAddressMode::ClampToEdge; #if TZ_DEBUG if(res.get_flags().contains({ResourceFlag::ImageFilterNearest, ResourceFlag::ImageFilterLinear})) { @@ -50,6 +51,23 @@ namespace tz::gl { filter = vk2::LookupFilter::Linear; } + + if(res.get_flags().contains({ResourceFlag::ImageWrapClampEdge, ResourceFlag::ImageWrapRepeat, ResourceFlag::ImageWrapMirroredRepeat})) + { + tz_error("ResourceFlags included all 3 of ImageWrapClampEdge, ImageWrapRepeat and ImageWrapMirroredRepeat, all of which are mutually exclusive. Please submit a bug report."); + } + if(res.get_flags().contains(ResourceFlag::ImageWrapClampEdge)) + { + mode = vk2::SamplerAddressMode::ClampToEdge; + } + if(res.get_flags().contains(ResourceFlag::ImageWrapRepeat)) + { + mode = vk2::SamplerAddressMode::Repeat; + } + if(res.get_flags().contains(ResourceFlag::ImageWrapMirroredRepeat)) + { + mode = vk2::SamplerAddressMode::MirroredRepeat; + } return { @@ -57,9 +75,9 @@ namespace tz::gl .min_filter = filter, .mag_filter = filter, .mipmap_mode = mip_filter, - .address_mode_u = vk2::SamplerAddressMode::ClampToEdge, - .address_mode_v = vk2::SamplerAddressMode::ClampToEdge, - .address_mode_w = vk2::SamplerAddressMode::ClampToEdge + .address_mode_u = mode, + .address_mode_v = mode, + .address_mode_w = mode }; };