+struct framebuffer {\r
+ framebuffer(const char *vertFilename, const char *fragFilename, int width, int height) {\r
+ glGenFramebuffers(1, &fbo);\r
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);\r
+ \r
+ glGenTextures(1, &renderTexture);\r
+ glBindTexture(GL_TEXTURE_2D, renderTexture);\r
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\r
+ //glBindTexture(GL_TEXTURE_2D, 0);\r
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, 0);\r
+\r
+ glGenRenderbuffers(1, &rbo);\r
+ glBindRenderbuffer(GL_RENDERBUFFER, rbo);\r
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);\r
+ //glBindRenderbuffer(GL_RENDERBUFFER, 0);\r
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);\r
+\r
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) {\r
+ printf("Successfully created framebuffer\n");\r
+ }\r
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+ \r
+ screenShaderProgram = compileShaders(vertFilename, fragFilename);\r
+ glUseProgram(screenShaderProgram);\r
+ glUniform1i(glGetUniformLocation(screenShaderProgram, "screenTexture"), 0);\r
+\r
+ // Screen VAO\r
+ \r
+ glGenBuffers(1, &screenVBO);\r
+\r
+ glGenVertexArrays(1, &screenVAO);\r
+\r
+ glBindVertexArray(screenVAO);\r
+\r
+ float screenVerts[] = {\r
+ -1.0f, +1.0f, +0.0f, +1.0f,\r
+ -1.0f, -1.0f, +0.0f, +0.0f,\r
+ +1.0f, -1.0f, +1.0f, +0.0f,\r
+ \r
+ -1.0f, +1.0f, +0.0f, +1.0f,\r
+ +1.0f, -1.0f, +1.0f, +0.0f,\r
+ +1.0f, +1.0f, +1.0f, +1.0f,\r
+ };\r
+\r
+ glBindBuffer(GL_ARRAY_BUFFER, screenVBO);\r
+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4,\r
+ screenVerts, GL_STATIC_DRAW);\r
+\r
+ glEnableVertexAttribArray(0);\r
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(0));\r
+ glEnableVertexAttribArray(1);\r
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(sizeof(float) * 2));\r
+\r
+ glBindVertexArray(0);\r
+ }\r
+ ~framebuffer() {\r
+ glDeleteFramebuffers(1, &fbo);\r
+ }\r
+ \r
+ GLuint fbo;\r
+ GLuint renderTexture;\r
+ GLuint rbo;\r
+ GLuint screenShaderProgram;\r
+ GLuint screenVBO;\r
+ GLuint screenVAO;\r
+};\r