gtsam_points
Loading...
Searching...
No Matches
glsl_shader.hpp
Go to the documentation of this file.
1#ifndef GLK_GLSL_SHADER_HPP
2#define GLK_GLSL_SHADER_HPP
3
4#include <thread>
5#include <vector>
6#include <memory>
7#include <string>
8#include <iostream>
9#include <optional>
10#include <unordered_set>
11#include <unordered_map>
12
13#include <GL/gl3w.h>
14#include <Eigen/Core>
15#include <glk/hash.hpp>
16#include <glk/make_shared.hpp>
17
18namespace glk {
19
21public:
24
25 bool attach_source(const std::string& filename, GLuint shader_type);
26 bool attach_source(const std::vector<std::string>& filenames, GLuint shader_type);
27
28 bool attach_source(const std::string& filename, const std::unordered_set<std::string>& include_filenames, const std::string& defines, GLuint shader_type);
29 bool attach_source(const std::vector<std::string>& filenames, const std::unordered_set<std::string>& include_filenames, const std::string& defines, GLuint shader_type);
30
31 bool add_feedback_varying(const std::string& name);
32
34
35 bool init(const std::string& shader_path);
36 bool init(const std::string& vertex_shader_path, const std::string& fragment_shader_path);
37 bool init(const std::vector<std::string>& vertex_shader_paths, const std::vector<std::string>& fragment_shader_paths);
38
39 GLuint id() const { return shader_program; }
40 void use() const { glUseProgram(shader_program); }
41 void unuse() const { glUseProgram(0); }
42
43 GLint attrib(std::uint64_t name, const char* debug_msg = nullptr);
44 GLint attrib(const std::string& name);
45 GLint uniform(std::uint64_t name, const char* debug_msg = nullptr);
46 GLint uniform(const std::string& name);
47 GLint subroutine(GLenum shader_type, std::uint64_t name, const char* debug_msg = nullptr);
48 GLint subroutine(GLenum shader_type, const std::string& name);
49 GLint subroutine_uniform(GLenum shader_type, std::uint64_t name, const char* debug_msg = nullptr);
50 GLint subroutine_uniform(GLenum shader_type, const std::string& name);
51
52 int get_uniformi(std::uint64_t name);
53 int get_uniformi(const std::string& name);
54
55 float get_uniformf(std::uint64_t name);
56 float get_uniformf(const std::string& name);
57
58 Eigen::Vector4f get_uniform4f(std::uint64_t name);
59 Eigen::Vector4f get_uniform4f(const std::string& name);
60
61 Eigen::Matrix4f get_uniform_matrix4f(std::uint64_t name);
62 Eigen::Matrix4f get_uniform_matrix4f(const std::string& name);
63
64 template <typename T>
65 T get_uniform_cache(std::uint64_t name) const {
66 const auto found = std::find_if(uniform_variable_cache.begin(), uniform_variable_cache.end(), [=](const auto& pair) { return pair.first == name; });
67 if (found == uniform_variable_cache.end()) {
68 std::cerr << "warning: failed to find uniform variable cache " << name << std::endl;
69 return T();
70 }
71 return *reinterpret_cast<const T*>(found->second.get());
72 }
73
74 template <typename T>
75 std::optional<T> get_uniform_cache_safe(std::uint64_t name) const {
76 const auto found = std::find_if(uniform_variable_cache.begin(), uniform_variable_cache.end(), [=](const auto& pair) { return pair.first == name; });
77 if (found == uniform_variable_cache.end()) {
78 return std::nullopt;
79 }
80 return *reinterpret_cast<const T*>(found->second.get());
81 }
82
83 // int
84 void set_uniform(std::uint64_t name, int value, const char* debug_msg = nullptr);
85 void set_uniform(const std::string& name, int value);
86
87 // float
88 void set_uniform(std::uint64_t name, float value, const char* debug_msg = nullptr);
89 void set_uniform(const std::string& name, float value);
90
91 // vec2f
92 void set_uniform(std::uint64_t name, const Eigen::Vector2f& vector, const char* debug_msg = nullptr);
93 void set_uniform(const std::string& name, const Eigen::Vector2f& vector);
94
95 // vec3f
96 void set_uniform(std::uint64_t name, const Eigen::Vector3f& vector, const char* debug_msg = nullptr);
97 void set_uniform(const std::string& name, const Eigen::Vector3f& vector);
98
99 // vec4f
100 void set_uniform(std::uint64_t name, const Eigen::Vector4f& vector, const char* debug_msg = nullptr);
101 void set_uniform(const std::string& name, const Eigen::Vector4f& vector);
102
103 // vec2i
104 void set_uniform(std::uint64_t name, const Eigen::Vector2i& vector, const char* debug_msg = nullptr);
105 void set_uniform(const std::string& name, const Eigen::Vector2i& vector);
106
107 // vec3i
108 void set_uniform(std::uint64_t name, const Eigen::Vector3i& vector, const char* debug_msg = nullptr);
109 void set_uniform(const std::string& name, const Eigen::Vector3i& vector);
110
111 // vec4i
112 void set_uniform(std::uint64_t name, const Eigen::Vector4i& vector, const char* debug_msg = nullptr);
113 void set_uniform(const std::string& name, const Eigen::Vector4i& vector);
114
115 // matrix4f
116 void set_uniform(std::uint64_t name, const Eigen::Matrix4f& matrix, const char* debug_msg = nullptr);
117 void set_uniform(const std::string& name, const Eigen::Matrix4f& matrix);
118
119 // array of int
120 void set_uniform(std::uint64_t name, const std::vector<int>& vectors, const char* debug_msg = nullptr);
121 void set_uniform(const std::string& name, const std::vector<int>& vectors);
122
123 // array of float
124 void set_uniform(std::uint64_t name, const std::vector<float>& vectors, const char* debug_msg = nullptr);
125 void set_uniform(const std::string& name, const std::vector<float>& vectors);
126
127 // array of vec2f
128 void set_uniform(std::uint64_t name, const std::vector<Eigen::Vector2f>& vectors, const char* debug_msg = nullptr);
129 void set_uniform(const std::string& name, const std::vector<Eigen::Vector2f>& vectors);
130
131 // array of vec3f
132 void set_uniform(std::uint64_t name, const std::vector<Eigen::Vector3f>& vectors, const char* debug_msg = nullptr);
133 void set_uniform(const std::string& name, const std::vector<Eigen::Vector3f>& vectors);
134
135 // array of vec4f
136 void set_uniform(std::uint64_t name, const std::vector<Eigen::Vector4f>& vectors, const char* debug_msg = nullptr);
137 void set_uniform(const std::string& name, const std::vector<Eigen::Vector4f>& vectors);
138 // matrix4d
139 void set_uniform(std::uint64_t name, const Eigen::Matrix4d& matrix_, const char* debug_msg = nullptr);
140 void set_uniform(const std::string& name, const Eigen::Matrix4d& matrix_);
141
142 void set_subroutine(GLenum shader_type, const std::string& loc, const std::string& func);
143
144private:
145 GLuint read_shader_from_file(const std::string& filename, const std::unordered_map<std::string, std::string>& include_map, const std::string& defines, GLuint shader_type);
146
147 template <typename T>
148 void set_uniform_cache(std::uint64_t h, const T& value) {
149 const auto found = std::find_if(uniform_variable_cache.begin(), uniform_variable_cache.end(), [&h](const auto& pair) { return pair.first == h; });
150 if (found != uniform_variable_cache.end()) {
151 *reinterpret_cast<T*>(found->second.get()) = value;
152 } else {
153 uniform_variable_cache.emplace_back(h, glk::make_shared<T>(value));
154 }
155 }
156
157private:
158 std::vector<GLuint> shaders;
159 std::vector<std::string> feedback_varyings;
160
161 GLuint shader_program;
162 std::vector<std::pair<std::uint64_t, GLint>> attrib_cache;
163 std::vector<std::pair<std::uint64_t, GLint>> uniform_cache;
164
165 std::vector<std::pair<std::uint64_t, GLint>> subroutine_cache;
166 std::vector<std::pair<std::uint64_t, std::shared_ptr<void>>> uniform_variable_cache;
167};
168
169} // namespace glk
170
171#endif
Definition glsl_shader.hpp:20
int get_uniformi(std::uint64_t name)
GLint subroutine_uniform(GLenum shader_type, std::uint64_t name, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const std::vector< float > &vectors, const char *debug_msg=nullptr)
GLint uniform(std::uint64_t name, const char *debug_msg=nullptr)
void set_subroutine(GLenum shader_type, const std::string &loc, const std::string &func)
void set_uniform(const std::string &name, const Eigen::Vector4i &vector)
void set_uniform(const std::string &name, int value)
T get_uniform_cache(std::uint64_t name) const
Definition glsl_shader.hpp:65
bool init(const std::string &shader_path)
GLint subroutine_uniform(GLenum shader_type, const std::string &name)
float get_uniformf(std::uint64_t name)
void set_uniform(std::uint64_t name, const Eigen::Vector3f &vector, const char *debug_msg=nullptr)
GLint attrib(std::uint64_t name, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const std::vector< int > &vectors)
GLint uniform(const std::string &name)
void set_uniform(const std::string &name, const Eigen::Vector3i &vector)
void set_uniform(std::uint64_t name, const Eigen::Vector4f &vector, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const Eigen::Matrix4d &matrix_, const char *debug_msg=nullptr)
bool init(const std::vector< std::string > &vertex_shader_paths, const std::vector< std::string > &fragment_shader_paths)
std::optional< T > get_uniform_cache_safe(std::uint64_t name) const
Definition glsl_shader.hpp:75
void set_uniform(const std::string &name, const Eigen::Matrix4f &matrix)
GLint subroutine(GLenum shader_type, std::uint64_t name, const char *debug_msg=nullptr)
Eigen::Matrix4f get_uniform_matrix4f(const std::string &name)
GLuint id() const
Definition glsl_shader.hpp:39
bool add_feedback_varying(const std::string &name)
void set_uniform(std::uint64_t name, const Eigen::Vector4i &vector, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const std::vector< float > &vectors)
void set_uniform(const std::string &name, const Eigen::Vector2f &vector)
bool attach_source(const std::string &filename, GLuint shader_type)
void set_uniform(std::uint64_t name, int value, const char *debug_msg=nullptr)
GLint subroutine(GLenum shader_type, const std::string &name)
GLint attrib(const std::string &name)
void set_uniform(const std::string &name, const std::vector< Eigen::Vector2f > &vectors)
void set_uniform(const std::string &name, const std::vector< Eigen::Vector4f > &vectors)
bool attach_source(const std::string &filename, const std::unordered_set< std::string > &include_filenames, const std::string &defines, GLuint shader_type)
void use() const
Definition glsl_shader.hpp:40
void set_uniform(std::uint64_t name, const Eigen::Vector3i &vector, const char *debug_msg=nullptr)
int get_uniformi(const std::string &name)
void set_uniform(const std::string &name, const Eigen::Vector4f &vector)
bool attach_source(const std::vector< std::string > &filenames, GLuint shader_type)
void set_uniform(const std::string &name, const Eigen::Vector3f &vector)
bool attach_source(const std::vector< std::string > &filenames, const std::unordered_set< std::string > &include_filenames, const std::string &defines, GLuint shader_type)
void set_uniform(std::uint64_t name, const std::vector< Eigen::Vector2f > &vectors, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const std::vector< Eigen::Vector3f > &vectors, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const std::vector< Eigen::Vector3f > &vectors)
void set_uniform(std::uint64_t name, const std::vector< Eigen::Vector4f > &vectors, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const Eigen::Matrix4d &matrix_)
Eigen::Matrix4f get_uniform_matrix4f(std::uint64_t name)
Eigen::Vector4f get_uniform4f(std::uint64_t name)
void set_uniform(const std::string &name, const Eigen::Vector2i &vector)
void set_uniform(const std::string &name, float value)
Eigen::Vector4f get_uniform4f(const std::string &name)
void set_uniform(std::uint64_t name, float value, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const Eigen::Vector2f &vector, const char *debug_msg=nullptr)
bool init(const std::string &vertex_shader_path, const std::string &fragment_shader_path)
void unuse() const
Definition glsl_shader.hpp:41
void set_uniform(std::uint64_t name, const Eigen::Vector2i &vector, const char *debug_msg=nullptr)
float get_uniformf(const std::string &name)
void set_uniform(std::uint64_t name, const std::vector< int > &vectors, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const Eigen::Matrix4f &matrix, const char *debug_msg=nullptr)
Definition async_buffer_copy.hpp:6
std::enable_if_t< needs_aligned_allocator< T >::value, std::shared_ptr< T > > make_shared(Args &&... args)
Definition make_shared.hpp:20