10 #include "glvertex_gl.h"
11 #include "glvertex_fbo_gl.h"
14 #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
15 #include <QApplication>
36 #define WGL_MACRO(proc,proctype) PFN##proctype##PROC proc;
37 #include "glvertex_fbo_wgl.h"
44 #define WGL_MACRO(proc,proctype) if ((proc=(PFN##proctype##PROC)wglGetProcAddress(#proc))==NULL) lglWarning(#proc" not supported");
45 #include "glvertex_fbo_wgl.h"
63 fboWidth_ = fboHeight_ = 0;
77 bool setupFBO(
int width,
int height,
bool fbomipmap =
false,
bool fbofloat =
false,
bool force =
false)
84 #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
85 float factor = qApp->devicePixelRatio();
91 #if (LGL_OPENGL_VERSION < 32)
94 if ((GL_EXTs=(
char *)glGetString(GL_EXTENSIONS)) != NULL)
95 if (strstr(GL_EXTs,
"EXT_framebuffer_object") != NULL)
100 fbomipmap!=fboMipmap_ || fbofloat!=fboFloat_)
102 #ifdef GL_EXT_framebuffer_object
110 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_);
115 fboMipmap_ = fbomipmap;
116 fboFloat_ = fbofloat;
119 glGenTextures(1, &textureId_);
120 glBindTexture(GL_TEXTURE_2D, textureId_);
121 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
122 #if (LGL_OPENGL_VERSION >= 30)
123 if (fbomipmap) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
124 else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
126 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
128 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
129 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
130 if (fbofloat) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB,
width,
height, 0, GL_RGBA, GL_HALF_FLOAT_ARB, 0);
131 else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
width,
height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
132 glBindTexture(GL_TEXTURE_2D, 0);
135 glGenRenderbuffers(1, &rboId_);
136 glBindRenderbuffer(GL_RENDERBUFFER, rboId_);
137 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT,
width,
height);
138 glBindRenderbuffer(GL_RENDERBUFFER, 0);
141 glGenFramebuffers(1, &fboId_);
142 glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
145 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId_, 0);
148 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboId_);
151 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
154 glBindFramebuffer(GL_FRAMEBUFFER, prev_);
157 if (status != GL_FRAMEBUFFER_COMPLETE)
destroyFBO();
162 #if (LGL_OPENGL_VERSION < 30)
172 #ifdef GL_EXT_framebuffer_object
174 if (textureId_ != 0) glDeleteTextures(1, &textureId_);
175 if (rboId_ != 0) glDeleteRenderbuffers(1, &rboId_);
176 if (fboId_ != 0) glDeleteFramebuffers(1, &fboId_);
183 fboWidth_ = fboHeight_ = 0;
193 #ifdef GL_EXT_framebuffer_object
199 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_);
202 glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
211 #ifdef GL_EXT_framebuffer_object
216 glBindFramebuffer(GL_FRAMEBUFFER, prev_);
218 #if (LGL_OPENGL_VERSION >= 30)
221 glBindTexture(GL_TEXTURE_2D, textureId_);
222 glGenerateMipmap(GL_TEXTURE_2D);
223 glBindTexture(GL_TEXTURE_2D, 0);
236 #ifdef GL_EXT_framebuffer_object
249 #ifdef GL_EXT_framebuffer_object
286 int fboWidth_, fboHeight_;
305 dboWidth_ = dboHeight_ = 0;
324 #if (LGL_OPENGL_VERSION < 32)
327 if ((GL_EXTs=(
char *)glGetString(GL_EXTENSIONS)) != NULL)
328 if (strstr(GL_EXTs,
"EXT_framebuffer_object") != NULL)
333 dbomipmap!=dboMipmap_)
335 #ifdef GL_EXT_framebuffer_object
343 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_);
348 dboMipmap_ = dbomipmap;
351 glGenTextures(1, &textureId_);
352 glBindTexture(GL_TEXTURE_2D, textureId_);
353 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
354 #if (LGL_OPENGL_VERSION >= 30)
355 if (dbomipmap) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
356 else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
360 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
361 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
362 #if (LGL_OPENGL_VERSION < 30)
363 glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
366 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
width,
height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
367 glBindTexture(GL_TEXTURE_2D, 0);
370 glGenFramebuffers(1, &dboId_);
371 glBindFramebuffer(GL_FRAMEBUFFER, dboId_);
374 glDrawBuffer(GL_NONE);
375 glReadBuffer(GL_NONE);
378 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId_, 0);
381 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
384 glBindFramebuffer(GL_FRAMEBUFFER, prev_);
387 glDrawBuffer(GL_BACK);
388 glReadBuffer(GL_BACK);
391 if (status != GL_FRAMEBUFFER_COMPLETE)
destroyDBO();
396 #if (LGL_OPENGL_VERSION < 30)
406 #ifdef GL_EXT_framebuffer_object
408 if (textureId_ != 0) glDeleteTextures(1, &textureId_);
409 if (dboId_ != 0) glDeleteFramebuffers(1, &dboId_);
415 dboWidth_ = dboHeight_ = 0;
424 #ifdef GL_EXT_framebuffer_object
430 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_);
433 glBindFramebuffer(GL_FRAMEBUFFER, dboId_);
436 glDrawBuffer(GL_NONE);
437 glReadBuffer(GL_NONE);
446 #ifdef GL_EXT_framebuffer_object
451 glBindFramebuffer(GL_FRAMEBUFFER, prev_);
454 glDrawBuffer(GL_BACK);
455 glReadBuffer(GL_BACK);
457 #if (LGL_OPENGL_VERSION >= 30)
460 glBindTexture(GL_TEXTURE_2D, textureId_);
461 glGenerateMipmap(GL_TEXTURE_2D);
462 glBindTexture(GL_TEXTURE_2D, 0);
475 #ifdef GL_EXT_framebuffer_object
488 #ifdef GL_EXT_framebuffer_object
519 int dboWidth_, dboHeight_;