diff options
-rw-r--r-- | include/vcl/opengl/OpenGLHelper.hxx | 6 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLHelper.cxx | 34 |
2 files changed, 30 insertions, 10 deletions
diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index f80d34b887fb..01346974f9e6 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -30,9 +30,11 @@ public: /** * The caller is responsible for deleting the buffer objects identified by * nFramebufferId, nRenderbufferDepthId and nRenderbufferColorId + * @param bRenderbuffer true => off-screen rendering, false => rendering to texture + * This also affects whether to free with glDeleteRenderbuffers or glDeleteTextures */ - static void createFramebuffer(long nWidth, long nHeight, - GLuint& nFramebufferId, GLuint& nRenderbufferTextId, GLuint& nRenderbufferColorId); + static void createFramebuffer(long nWidth, long nHeight, GLuint& nFramebufferId, + GLuint& nRenderbufferTextId, GLuint& nRenderbufferColorId, bool bRenderbuffer = true); // Get OpenGL version (needs a context) static float getGLVersion(); diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index a34ad753f811..d58b537ffef4 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -275,8 +275,8 @@ std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix) return rStrm; } -void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, - GLuint& nFramebufferId, GLuint& nRenderbufferDepthId, GLuint& nRenderbufferColorId) +void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, GLuint& nFramebufferId, + GLuint& nRenderbufferDepthId, GLuint& nRenderbufferColorId, bool bRenderbuffer) { // create a renderbuffer for depth attachment glGenRenderbuffers(1, &nRenderbufferDepthId); @@ -284,13 +284,31 @@ void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, nWidth, nHeight); glBindRenderbuffer(GL_RENDERBUFFER, 0); - // create a renderbuffer for color attachment - glGenRenderbuffers(1, &nRenderbufferColorId); - glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferColorId); - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, nWidth, nHeight); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + if(bRenderbuffer) + { + // create a renderbuffer for color attachment + glGenRenderbuffers(1, &nRenderbufferColorId); + glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferColorId); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, nWidth, nHeight); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } + else + { + glGenTextures(1, &nRenderbufferColorId); + glBindTexture(GL_TEXTURE_2D, nRenderbufferColorId); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, nRenderbufferColorId, 0); + } - // create a framebuffer object and attach renderbuffer and texture + // create a framebuffer object and attach renderbuffer glGenFramebuffers(1, &nFramebufferId); glCheckFramebufferStatus(GL_FRAMEBUFFER); glBindFramebuffer(GL_FRAMEBUFFER, nFramebufferId); |