diff options
author | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-05-21 00:41:37 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-05-21 01:50:44 +0200 |
commit | 8c39739a38237df6e8f39f312cf08fadae896ae4 (patch) | |
tree | df9e59020a20919a3b144b007829047ac48067e8 | |
parent | e634b0dcdd6286cef92dac83847af8b6fb08ce70 (diff) |
add method for creating framebuffer objects to OpenGLHelper
Change-Id: I08bd2e58ee98a68accae256fcbcc288a8c56ae0b
-rw-r--r-- | include/vcl/opengl/OpenGLHelper.hxx | 7 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLHelper.cxx | 36 |
2 files changed, 43 insertions, 0 deletions
diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index 3cb482ba09b4..70b1d2aa637a 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -29,6 +29,13 @@ public: static void renderToFile(long nWidth, long nHeight, const OUString& rFileName); static const char* GLErrorString(GLenum errorCode); + + /** + * The caller is responsible for deleting the buffer objects identified by + * nFramebufferId, nRenderbufferId and nTexturebufferId + */ + static void createFramebuffer(long nWidth, long nHeight, + GLuint& nFramebufferId, GLuint& nRenderbufferId, GLuint& nTexturebufferId); }; VCLOPENGL_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix); diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index 0e9d7107988d..ad2506d9166e 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -268,5 +268,41 @@ std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix) return rStrm; } +void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, + GLuint& nFramebufferId, GLuint& nRenderbufferId, GLuint& nTexturebufferId) +{ + // create a renderbuffer + glGenRenderbuffers(1, &nRenderbufferId); + glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferId); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, nWidth, nHeight); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + // create a texture + glGenTextures(1, &nTexturebufferId); + glBindTexture(GL_TEXTURE_2D, nTexturebufferId); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glBindTexture(GL_TEXTURE_2D, 0); + + // create a framebuffer object and attach renderbuffer and texture + glGenFramebuffers(1, &nFramebufferId); + glCheckFramebufferStatus(GL_FRAMEBUFFER); + glBindFramebuffer(GL_FRAMEBUFFER, nFramebufferId); + glBindTexture(GL_TEXTURE_2D, nTexturebufferId); + // attach a texture to FBO color attachement point + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, nTexturebufferId, 0); + glCheckFramebufferStatus(GL_FRAMEBUFFER); + glBindTexture(GL_TEXTURE_2D, 0); + // attach a renderbuffer to depth attachment point + glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferId); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, nRenderbufferId); + glCheckFramebufferStatus(GL_FRAMEBUFFER); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |