| 0.8.2 API documentation

- Main Page
- Namespaces
- Classes
- Files

- File List

mipmaps_compute.hpp
1 #pragma once
2
3 #include "filter_compute.hpp"
4
5 namespace gli{
6 namespace detail
7 {
8 template <typename texture_type, typename sampler_value_type, typename fetch_func, typename write_func, typename normalized_type, typename texel_type>
9 inline void generate_mipmaps_1d
10 (
11 texture_type & Texture, fetch_func Fetch, write_func Write,
12 typename texture_type::size_type BaseLayer, typename texture_type::size_type MaxLayer,
13 typename texture_type::size_type BaseFace, typename texture_type::size_type MaxFace,
14 typename texture_type::size_type BaseLevel, typename texture_type::size_type MaxLevel,
15 filter Min
16 )
17 {
18 typedef typename detail::interpolate<sampler_value_type>::type interpolate_type;
19 typedef typename texture_type::extent_type extent_type;
20 typedef typename texture_type::size_type size_type;
21 typedef typename extent_type::value_type component_type;
22 typedef typename detail::filterBase<detail::DIMENSION_1D, texture_type, interpolate_type, normalized_type, fetch_func, texel_type>::filterFunc filter_func;
23
24 filter_func const Filter = detail::get_filter<filter_func, detail::DIMENSION_1D, texture_type, interpolate_type, normalized_type, fetch_func, texel_type, sampler_value_type>(FILTER_NEAREST, Min, false);
25 GLI_ASSERT(Filter);
26
27 for(size_type Layer = BaseLayer; Layer <= MaxLayer; ++Layer)
28 for(size_type Face = BaseFace; Face <= MaxFace; ++Face)
29 for(size_type Level = BaseLevel; Level < MaxLevel; ++Level)
30 {
31 extent_type const& ExtentDst = Texture.extent(Level + 1);
32 normalized_type const& Scale = normalized_type(1) / normalized_type(max(ExtentDst - extent_type(1), extent_type(1)));
33
34 for(component_type i = 0; i < ExtentDst.x; ++i)
35 {
36 normalized_type const& SamplePosition(normalized_type(static_cast<typename normalized_type::value_type>(i)) * Scale);
37 texel_type const& Texel = Filter(Texture, Fetch, SamplePosition, Layer, Face, static_cast<sampler_value_type>(Level), texel_type(0));
38 Write(Texture, extent_type(i), Layer, Face, Level + 1, Texel);
39 }
40 }
41 }
42
43 template <typename texture_type, typename sampler_value_type, typename fetch_func, typename write_func, typename normalized_type, typename texel_type>
44 inline void generate_mipmaps_2d
45 (
46 texture_type & Texture, fetch_func Fetch, write_func Write,
47 typename texture_type::size_type BaseLayer, typename texture_type::size_type MaxLayer,
48 typename texture_type::size_type BaseFace, typename texture_type::size_type MaxFace,
49 typename texture_type::size_type BaseLevel, typename texture_type::size_type MaxLevel,
50 filter Min
51 )
52 {
53 typedef typename detail::interpolate<sampler_value_type>::type interpolate_type;
54 typedef typename texture_type::extent_type extent_type;
55 typedef typename texture_type::size_type size_type;
56 typedef typename extent_type::value_type component_type;
57 typedef typename detail::filterBase<detail::DIMENSION_2D, texture_type, interpolate_type, normalized_type, fetch_func, texel_type>::filterFunc filter_func;
58
59 filter_func const Filter = detail::get_filter<filter_func, detail::DIMENSION_2D, texture_type, interpolate_type, normalized_type, fetch_func, texel_type, sampler_value_type>(FILTER_NEAREST, Min, false);
60 GLI_ASSERT(Filter);
61
62 for(size_type Layer = BaseLayer; Layer <= MaxLayer; ++Layer)
63 for(size_type Face = BaseFace; Face <= MaxFace; ++Face)
64 for(size_type Level = BaseLevel; Level < MaxLevel; ++Level)
65 {
66 extent_type const& ExtentDst = Texture.extent(Level + 1);
67 normalized_type const& Scale = normalized_type(1) / normalized_type(max(ExtentDst - extent_type(1), extent_type(1)));
68
69 for(component_type j = 0; j < ExtentDst.y; ++j)
70 for(component_type i = 0; i < ExtentDst.x; ++i)
71 {
72 normalized_type const& SamplePosition(normalized_type(i, j) * Scale);
73 texel_type const& Texel = Filter(Texture, Fetch, SamplePosition, Layer, Face, static_cast<sampler_value_type>(Level), texel_type(0));
74 Write(Texture, extent_type(i, j), Layer, Face, Level + 1, Texel);
75 }
76 }
77 }
78
79 template <typename texture_type, typename sampler_value_type, typename fetch_func, typename write_func, typename normalized_type, typename texel_type>
80 inline void generate_mipmaps_3d
81 (
82 texture_type & Texture, fetch_func Fetch, write_func Write,
83 typename texture_type::size_type BaseLayer, typename texture_type::size_type MaxLayer,
84 typename texture_type::size_type BaseFace, typename texture_type::size_type MaxFace,
85 typename texture_type::size_type BaseLevel, typename texture_type::size_type MaxLevel,
86 filter Min
87 )
88 {
89 typedef typename detail::interpolate<sampler_value_type>::type interpolate_type;
90 typedef typename texture_type::extent_type extent_type;
91 typedef typename texture_type::size_type size_type;
92 typedef typename extent_type::value_type component_type;
93 typedef typename detail::filterBase<detail::DIMENSION_3D, texture_type, interpolate_type, normalized_type, fetch_func, texel_type>::filterFunc filter_func;
94
95 filter_func const Filter = detail::get_filter<filter_func, detail::DIMENSION_3D, texture_type, interpolate_type, normalized_type, fetch_func, texel_type, sampler_value_type>(FILTER_NEAREST, Min, false);
96 GLI_ASSERT(Filter);
97
98 for(size_type Layer = BaseLayer; Layer <= MaxLayer; ++Layer)
99 for(size_type Face = BaseFace; Face <= MaxFace; ++Face)
100 for(size_type Level = BaseLevel; Level < MaxLevel; ++Level)
101 {
102 extent_type const& ExtentDst = Texture.extent(Level + 1);
103 normalized_type const& Scale = normalized_type(1) / normalized_type(max(ExtentDst - extent_type(1), extent_type(1)));
104
105 for(component_type k = 0; k < ExtentDst.z; ++k)
106 for(component_type j = 0; j < ExtentDst.y; ++j)
107 for(component_type i = 0; i < ExtentDst.x; ++i)
108 {
109 normalized_type const& SamplePosition(normalized_type(i, j, k) * Scale);
110 texel_type const& Texel = Filter(Texture, Fetch, SamplePosition, Layer, Face, static_cast<sampler_value_type>(Level), texel_type(0));
111 Write(Texture, extent_type(i, j, k), Layer, Face, Level + 1, Texel);
112 }
113 }
114 }
115 }//namespace detail
116 }//namespace gli
gli::filter
filter
Texture filtring modes.
Definition: filter.hpp:9
gli
Namespace where all the classes and functions provided by GLI are exposed.
Definition: clear.hpp:6