summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-05-21 00:41:37 +0200
committerMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-05-21 01:50:44 +0200
commit8c39739a38237df6e8f39f312cf08fadae896ae4 (patch)
treedf9e59020a20919a3b144b007829047ac48067e8
parente634b0dcdd6286cef92dac83847af8b6fb08ce70 (diff)
add method for creating framebuffer objects to OpenGLHelper
Change-Id: I08bd2e58ee98a68accae256fcbcc288a8c56ae0b
-rw-r--r--include/vcl/opengl/OpenGLHelper.hxx7
-rw-r--r--vcl/source/opengl/OpenGLHelper.cxx36
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: */