MeshLib C++ Docs
Loading...
Searching...
No Matches
MRRenderGLHelpers.h
Go to the documentation of this file.
1#pragma once
3#include "MRGladGlfw.h"
4#include "exports.h"
5#include "MRMesh/MRColor.h"
6#include "MRMesh/MRVector2.h"
7#include "MRGLTexture.h"
8#include "MRGLMacro.h"
9#include <cassert>
10
11namespace MR
12{
13
14// represents OpenGL buffer owner, and allows uploading data in it remembering buffer size
16{
17 constexpr static GLuint NO_BUF = 0;
18public:
19 GlBuffer() = default;
20 GlBuffer( const GlBuffer & ) = delete;
21 GlBuffer( GlBuffer && r ) : bufferID_( r.bufferID_ ), size_( r.size_ ) { r.detach_(); }
22 ~GlBuffer() { del(); }
23
24 GlBuffer& operator =( const GlBuffer & ) = delete;
25 GlBuffer& operator =( GlBuffer && r ) { del(); bufferID_ = r.bufferID_; size_ = r.size_; r.detach_(); return * this; }
26
27 auto getId() const { return bufferID_; }
28 bool valid() const { return bufferID_ != NO_BUF; }
29 size_t size() const { return size_; }
30
31 // generates new buffer
32 MRVIEWER_API void gen();
33
34 // deletes the buffer
35 MRVIEWER_API void del();
36
37 // binds current buffer to OpenGL context
38 MRVIEWER_API void bind( GLenum target );
39
40 // creates GL data buffer using given data and binds it
41 MRVIEWER_API void loadData( GLenum target, const char * arr, size_t arrSize );
42 template<typename T>
43 void loadData( GLenum target, const T * arr, size_t arrSize ) { loadData( target, (const char *)arr, sizeof( T ) * arrSize ); }
44 template<typename C>
45 void loadData( GLenum target, const C & cont ) { loadData( target, cont.data(), cont.size() ); }
46
47 // binds current buffer to OpenGL context, optionally refreshing its data
48 MRVIEWER_API void loadDataOpt( GLenum target, bool refresh, const char * arr, size_t arrSize );
49 template<typename T>
50 void loadDataOpt( GLenum target, bool refresh, const T * arr, size_t arrSize ) { loadDataOpt( target, refresh, (const char *)arr, sizeof( T ) * arrSize ); }
51 template<typename C>
52 void loadDataOpt( GLenum target, bool refresh, const C & cont ) { loadDataOpt( target, refresh, cont.data(), cont.size() ); }
53
54private:
56 void detach_() { bufferID_ = NO_BUF; size_ = 0; }
57
58private:
59 GLuint bufferID_ = NO_BUF;
60 size_t size_ = 0;
61};
62
63// represents OpenGL 2D texture owner, and allows uploading data in it remembering texture size
64class GlTexture2 : public GlTexture
65{
66public:
67 GlTexture2() : GlTexture( GL_TEXTURE_2D ){}
68
69 static Vector3i ToResolution( const Vector2i& value )
70 {
71 return Vector3i( value.x, value.y, 1 );
72 }
73private:
74 MRVIEWER_API virtual void texImage_( const Settings& settings, const char* arr ) override;
75};
76
77// represents OpenGL 3D texture owner, and allows uploading data in it remembering texture size
78class GlTexture3 : public GlTexture
79{
80public:
81 GlTexture3() : GlTexture( GL_TEXTURE_3D ){}
82private:
83 MRVIEWER_API virtual void texImage_( const Settings& settings, const char* arr ) override;
84};
85
86// represents OpenGL array texture 2D owner, and allows uploading data in it remembering texture size
88{
89public:
90 GlTexture2DArray() : GlTexture( GL_TEXTURE_2D_ARRAY ){}
91private:
92 MRVIEWER_API virtual void texImage_( const Settings& settings, const char* arr ) override;
93};
94
96{
97 GLuint program_shader = 0;
98 const char * name = nullptr;
100 const char * arr = nullptr;
101 size_t arrSize = 0;
103 bool refresh = false;
104 bool forceUse = false;
105 bool isColor = false;
106};
107
108MRVIEWER_API GLint bindVertexAttribArray( const BindVertexAttribArraySettings & settings );
109
110template<typename T, template<typename, typename...> class C, typename... args>
112 const GLuint program_shader,
113 const char * name,
114 GlBuffer & buf,
115 const C<T, args...>& V,
116 int baseTypeElementsNumber,
117 bool refresh,
118 bool forceUse = false )
119{
121 {
122 .program_shader = program_shader,
123 .name = name,
124 .buf = buf,
125 .arr = (const char*)V.data(),
126 .arrSize = sizeof(T) * V.size(),
127 .baseTypeElementsNumber = baseTypeElementsNumber,
128 .refresh = refresh,
129 .forceUse = forceUse,
130 .isColor = std::is_same_v<Color, T>
131 };
132 return bindVertexAttribArray( settings );
133}
134
135template <typename T, std::size_t N>
137 const GLuint program_shader,
138 const char * name,
139 GlBuffer & buf,
140 const std::array<T, N>& V,
141 int baseTypeElementsNumber,
142 bool refresh,
143 bool forceUse = false )
144{
146 {
147 .program_shader = program_shader,
148 .name = name,
149 .buf = buf,
150 .arr = (const char*)V.data(),
151 .arrSize = sizeof(T) * N,
152 .baseTypeElementsNumber = baseTypeElementsNumber,
153 .refresh = refresh,
154 .forceUse = forceUse,
155 .isColor = std::is_same_v<Color, T>
156 };
157 return bindVertexAttribArray( settings );
158}
159
160// return real GL value for DepthFunction
161// default is less
163{
164 switch ( funcType )
165 {
168 return GL_LESS;
170 return GL_NEVER;
172 return GL_LEQUAL;
174 return GL_EQUAL;
176 return GL_GEQUAL;
178 return GL_GREATER;
180 return GL_ALWAYS;
182 return GL_NOTEQUAL;
183 default:
184 return 0;
185 }
186}
187
188// return real GL value for DepthFunction
189// default is less or equal
191{
192 if ( funcType == DepthFunction::Default )
193 return GL_LEQUAL;
194 return getDepthFunctionLess( funcType );
195}
196
197// class for rendering simple texture
198class MRVIEWER_CLASS QuadTextureVertexObject
199{
200public:
201 // generates simple quad for rendering
202 MRVIEWER_API void gen();
203 // binds simple quad vertex data
204 MRVIEWER_API void bind();
205 // removes this object
206 MRVIEWER_API void del();
207private:
208 unsigned vao_{ 0 };
209 unsigned vbo_{ 0 };
210};
211
212// class for easier rendering in framebuffer texture
213class MRVIEWER_CLASS FramebufferData
214{
215public:
216 // generates framebuffer and associated data
217 // msaaPow - 2^msaaPow samples, msaaPow < 0 - use same default amount of samples
218 // to resize: del(); gen( newSize, msaaPow );
219 MRVIEWER_API void gen( const Vector2i& size, bool copyDepth, int msaaPow, bool highPrecisionDepth = false );
220 // binds this framebuffer as main rendering target
221 // clears it if `clear` flag is set
222 MRVIEWER_API void bind( bool clear = true, float clearDepth = 1.0f );
223 // binds default framebuffer (and read/draw framebuffers)
224 // make sure to bind correct framebuffer `getViewerInstance().bindSceneTexture( true )`
225 MRVIEWER_API void bindDefault();
226 // marks the texture to reading
227 MRVIEWER_API void bindTexture( bool color = true, bool depth = true );
228 // copies picture rendered in this framebuffer to associated texutre for further use
229 // and binds default framebuffer (and read/draw framebuffers)
230 // make sure to bind correct framebuffer afterwards
231 MRVIEWER_API void copyTextureBindDef();
232 // removes this framebuffer
233 MRVIEWER_API void del();
234 // gets texture id for binding in other shaders
235 unsigned getColorTexture() const { return resColorTexture_.getId(); }
236 unsigned getDepthTexture() const { return resDepthTexture_.getId(); }
237
238 const Vector2i& getSize() const { return size_; }
239 // return true if texture is bound
240 bool isBound() const { return isBound_; }
241
243 {
244 Vector2i size; // size of the viewport that is used in `draw` function
245 WrapType wrap{ WrapType::Clamp }; // wrap type of underlaying textures
246 FilterType filter{ FilterType::Linear }; // filter type of underlaying textures
247 bool forceSimpleDepthDraw = false; // force using `simpleDepth` for all fragments even if depth texture is present
248 float simpleDepth = 0.5f; // depth that is used if this framebuffer does not store depth component texture
249 };
250 // draws this framebuffer using `quadObject`
251 MRVIEWER_API void draw( QuadTextureVertexObject& quadObject, const DrawParams& params ) const;
252private:
253 void resize_( const Vector2i& size, int msaaPow );
254
255 bool isBound_{ false };
256 bool highPrecisionDepth_{ false };
257 unsigned mainFramebuffer_{ 0 };
258 unsigned colorRenderbuffer_{ 0 };
259 unsigned depthRenderbuffer_{ 0 };
260 unsigned copyFramebuffer_{ 0 };
261 GlTexture2 resColorTexture_;
262 GlTexture2 resDepthTexture_;
263 Vector2i size_;
264};
265
266// helper function to bind depth and color buffers to given shader program
267MRVIEWER_API void bindDepthPeelingTextures( GLuint shaderId, const TransparencyMode& tMode, GLenum startGLTextureIndex );
268
269// defines OpenGl settings for desired pass with given settings
270// make sure to call `objectPostRenderSetup` after drawing to restore defaults
271MRVIEWER_API void objectPreRenderSetup( const TransparencyMode& tMode, RenderModelPassMask desiredPass, bool deptTesting );
272MRVIEWER_API void objectPostRenderSetup( const TransparencyMode& tMode, RenderModelPassMask desiredPass, bool deptTesting );
273
274} //namespace MR
Definition MRRenderGLHelpers.h:214
MRVIEWER_API void gen(const Vector2i &size, bool copyDepth, int msaaPow, bool highPrecisionDepth=false)
MRVIEWER_API void bindDefault()
MRVIEWER_API void draw(QuadTextureVertexObject &quadObject, const DrawParams &params) const
unsigned getColorTexture() const
Definition MRRenderGLHelpers.h:235
MRVIEWER_API void copyTextureBindDef()
bool isBound() const
Definition MRRenderGLHelpers.h:240
MRVIEWER_API void bindTexture(bool color=true, bool depth=true)
unsigned getDepthTexture() const
Definition MRRenderGLHelpers.h:236
const Vector2i & getSize() const
Definition MRRenderGLHelpers.h:238
MRVIEWER_API void bind(bool clear=true, float clearDepth=1.0f)
MRVIEWER_API void del()
Definition MRRenderGLHelpers.h:16
MRVIEWER_API void gen()
MRVIEWER_API void loadData(GLenum target, const char *arr, size_t arrSize)
MRVIEWER_API void del()
void loadData(GLenum target, const T *arr, size_t arrSize)
Definition MRRenderGLHelpers.h:43
void loadData(GLenum target, const C &cont)
Definition MRRenderGLHelpers.h:45
GlBuffer(GlBuffer &&r)
Definition MRRenderGLHelpers.h:21
auto getId() const
Definition MRRenderGLHelpers.h:27
GlBuffer()=default
void loadDataOpt(GLenum target, bool refresh, const C &cont)
Definition MRRenderGLHelpers.h:52
GlBuffer & operator=(const GlBuffer &)=delete
~GlBuffer()
Definition MRRenderGLHelpers.h:22
GlBuffer(const GlBuffer &)=delete
void loadDataOpt(GLenum target, bool refresh, const T *arr, size_t arrSize)
Definition MRRenderGLHelpers.h:50
size_t size() const
Definition MRRenderGLHelpers.h:29
MRVIEWER_API void loadDataOpt(GLenum target, bool refresh, const char *arr, size_t arrSize)
MRVIEWER_API void bind(GLenum target)
bool valid() const
Definition MRRenderGLHelpers.h:28
Definition MRRenderGLHelpers.h:88
GlTexture2DArray()
Definition MRRenderGLHelpers.h:90
Definition MRRenderGLHelpers.h:65
GlTexture2()
Definition MRRenderGLHelpers.h:67
static Vector3i ToResolution(const Vector2i &value)
Definition MRRenderGLHelpers.h:69
Definition MRRenderGLHelpers.h:79
GlTexture3()
Definition MRRenderGLHelpers.h:81
Definition MRGLTexture.h:18
Definition MRRenderGLHelpers.h:199
MRVIEWER_API void gen()
MRVIEWER_API void del()
MRVIEWER_API void bind()
Definition MRCameraOrientationPlugin.h:8
MRVIEWER_API GLint bindVertexAttribArray(const BindVertexAttribArraySettings &settings)
WrapType
Definition MREnums.h:15
MRVIEWER_API void objectPostRenderSetup(const TransparencyMode &tMode, RenderModelPassMask desiredPass, bool deptTesting)
MRVIEWER_API void objectPreRenderSetup(const TransparencyMode &tMode, RenderModelPassMask desiredPass, bool deptTesting)
int getDepthFunctionLEqual(DepthFunction funcType)
Definition MRRenderGLHelpers.h:190
FilterType
Definition MREnums.h:9
RenderModelPassMask
Various passes of the 3D rendering.
Definition MRRenderModelParameters.h:37
DepthFunction
Definition MRIRenderObject.h:18
int getDepthFunctionLess(DepthFunction funcType)
Definition MRRenderGLHelpers.h:162
MRVIEWER_API void bindDepthPeelingTextures(GLuint shaderId, const TransparencyMode &tMode, GLenum startGLTextureIndex)
Definition MRRenderGLHelpers.h:96
const char * arr
Definition MRRenderGLHelpers.h:100
GlBuffer & buf
Definition MRRenderGLHelpers.h:99
const char * name
Definition MRRenderGLHelpers.h:98
size_t arrSize
Definition MRRenderGLHelpers.h:101
int baseTypeElementsNumber
Definition MRRenderGLHelpers.h:102
GLuint program_shader
Definition MRRenderGLHelpers.h:97
bool refresh
Definition MRRenderGLHelpers.h:103
bool isColor
Definition MRRenderGLHelpers.h:105
bool forceUse
Definition MRRenderGLHelpers.h:104
Definition MRRenderGLHelpers.h:243
Vector2i size
Definition MRRenderGLHelpers.h:244
struct to determine transparent rendering mode
Definition MRRenderModelParameters.h:10