Skip to content

Commit 11b46b0

Browse files
committed
Added ability to bind a global framebuffer at the start of every render, added ability for Cameras to use global framebuffer as color input, allowing post processing filters to be applied to everything that has been rendered on screen so far
1 parent 16ab088 commit 11b46b0

File tree

5 files changed

+111
-15
lines changed

5 files changed

+111
-15
lines changed

Core/Contents/Include/PolyCamera.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,14 @@ namespace Polycode {
309309
*/
310310
int getProjectionMode() const { return projectionMode; }
311311

312+
void setUseGlobalFramebuffer(bool val);
313+
bool getUseGlobalFramebuffer() const;
312314

313315
protected:
314316

317+
bool useGlobalFramebuffer;
315318
int projectionMode;
316-
319+
317320
Matrix4 projectionMatrix;
318321

319322
Polycode::Rectangle viewport;

Core/Contents/Include/PolyRenderer.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ namespace Polycode {
9393

9494
virtual void Resize(int xRes, int yRes) = 0;
9595

96-
virtual void BeginRender() = 0;
97-
virtual void EndRender() = 0;
96+
virtual void BeginRender();
97+
virtual void EndRender();
9898

9999
virtual Cubemap *createCubemap(Texture *t0, Texture *t1, Texture *t2, Texture *t3, Texture *t4, Texture *t5) = 0;
100100
virtual Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, bool createMipmaps, int type=Image::IMAGE_RGBA) = 0;
@@ -301,6 +301,12 @@ namespace Polycode {
301301
void loadVertexColorIdentity();
302302
void multiplyVertexColor(const Color &color);
303303

304+
void setRenderToGlobalFramebuffer(bool val);
305+
bool getRenderToGlobalFramebuffer() const;
306+
307+
Texture *getGlobalColorFramebuffer() const;
308+
Texture *getGlobalDepthFramebuffer() const;
309+
304310
protected:
305311
virtual void initOSSpecific() {};
306312

@@ -337,6 +343,10 @@ namespace Polycode {
337343

338344
PolycodeShaderModule* currentShaderModule;
339345
std::vector <PolycodeShaderModule*> shaderModules;
346+
347+
bool renderToGlobalFramebuffer;
348+
Texture *globalColorFramebuffer;
349+
Texture *globalDepthFramebuffer;
340350

341351
std::vector<LightInfo> lights;
342352
std::vector<LightInfo> pointLights;

Core/Contents/Source/PolyCamera.cpp

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ Camera::Camera(Scene *parentScene) : Entity() {
4949
topLeftOrtho = false;
5050
orthoSizeX = 1.0;
5151
orthoSizeY = 1.0;
52+
useGlobalFramebuffer = false;
5253
}
5354

5455
Camera::~Camera() {
@@ -60,6 +61,14 @@ Camera::~Camera() {
6061
delete zBufferSceneTexture;
6162
}
6263

64+
void Camera::setUseGlobalFramebuffer(bool val) {
65+
useGlobalFramebuffer = val;
66+
}
67+
68+
bool Camera::getUseGlobalFramebuffer() const {
69+
return useGlobalFramebuffer;
70+
}
71+
6372
void Camera::setClippingPlanes(Number nearClipPlane, Number farClipPlane) {
6473
this->nearClipPlane = nearClipPlane;
6574
this->farClipPlane = farClipPlane;
@@ -361,38 +370,57 @@ void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Numbe
361370
if(!filterShaderMaterial)
362371
return;
363372

364-
Texture *finalTargetColorTexture;
365-
Texture *finalTargetZTexture;
373+
Texture *finalTargetColorTexture = NULL;
374+
Texture *finalTargetZTexture = NULL;
366375

367376
if(targetTexture) {
368377
finalTargetColorTexture = targetColorTexture;
369378
finalTargetZTexture = targetZTexture;
370379
renderer->setViewportSize(targetTextureWidth, targetTextureHeight);
371380
} else {
372-
finalTargetColorTexture = originalSceneTexture;
373-
finalTargetZTexture = zBufferSceneTexture;
374-
renderer->setViewportSize(renderer->getXRes(), renderer->getYRes());
381+
if(!useGlobalFramebuffer) {
382+
finalTargetColorTexture = originalSceneTexture;
383+
finalTargetZTexture = zBufferSceneTexture;
384+
}
385+
renderer->setViewportSize(renderer->getXRes(), renderer->getYRes());
375386
}
376-
renderer->bindFrameBufferTexture(finalTargetColorTexture);
377-
renderer->bindFrameBufferTextureDepth(finalTargetZTexture);
387+
388+
if(finalTargetColorTexture) {
389+
renderer->bindFrameBufferTexture(finalTargetColorTexture);
390+
}
391+
if(finalTargetZTexture) {
392+
renderer->bindFrameBufferTextureDepth(finalTargetZTexture);
393+
}
378394
parentScene->Render(this);
379-
renderer->unbindFramebuffers();
395+
396+
if(finalTargetColorTexture && finalTargetZTexture) {
397+
renderer->unbindFramebuffers();
398+
}
380399

381400

382-
ShaderBinding* materialBinding;
401+
ShaderBinding* materialBinding;
383402
for(int i=0; i < filterShaderMaterial->getNumShaders(); i++) {
384403
materialBinding = filterShaderMaterial->getShaderBinding(i);
385404

386405
for(int j=0; j < materialBinding->getNumColorTargetBindings(); j++) {
387406
RenderTargetBinding *colorBinding = materialBinding->getColorTargetBinding(j);
388407
materialBinding->clearTexture(colorBinding->name);
389-
materialBinding->addTexture(colorBinding->name, finalTargetColorTexture);
408+
409+
if(finalTargetColorTexture) {
410+
materialBinding->addTexture(colorBinding->name, finalTargetColorTexture);
411+
} else {
412+
materialBinding->addTexture(colorBinding->name, renderer->getGlobalColorFramebuffer());
413+
}
390414
}
391415

392416
for(int j=0; j < materialBinding->getNumDepthTargetBindings(); j++) {
393417
RenderTargetBinding *depthBinding = materialBinding->getDepthTargetBinding(j);
394418
materialBinding->clearTexture(depthBinding->name);
395-
materialBinding->addTexture(depthBinding->name, finalTargetZTexture);
419+
if(finalTargetZTexture) {
420+
materialBinding->addTexture(depthBinding->name, finalTargetZTexture);
421+
} else {
422+
materialBinding->addTexture(depthBinding->name, renderer->getGlobalDepthFramebuffer());
423+
}
396424
}
397425

398426
renderer->applyMaterial(filterShaderMaterial, localShaderOptions[i], i, true);
@@ -406,6 +434,13 @@ void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Numbe
406434
renderer->drawScreenQuad(targetTextureWidth, targetTextureHeight);
407435
renderer->unbindFramebuffers();
408436
} else {
437+
// global framebuffer ONLY used for input
438+
// we must unbind it here.
439+
// this is a bit of a hack, a better system
440+
// would be to define override buffers
441+
if(useGlobalFramebuffer) {
442+
renderer->unbindFramebuffers();
443+
}
409444
renderer->setViewportSize(renderer->getXRes(), renderer->getYRes());
410445
renderer->clearScreen();
411446
renderer->loadIdentity();
@@ -494,5 +529,5 @@ void Camera::doCameraTransform() {
494529
Matrix4 camMatrix = getConcatenatedMatrix();
495530
renderer->setCameraMatrix(camMatrix);
496531
camMatrix = camMatrix.Inverse();
497-
renderer->multModelviewMatrix(camMatrix);
532+
renderer->multModelviewMatrix(camMatrix);
498533
}

Core/Contents/Source/PolyGLRenderer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,9 @@ void OpenGLRenderer::setPerspectiveDefaults() {
640640
}
641641

642642
void OpenGLRenderer::BeginRender() {
643+
644+
Renderer::BeginRender();
645+
643646
if(doClearBuffer) {
644647
glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
645648
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -1027,6 +1030,7 @@ void OpenGLRenderer::setVertexColor(Number r, Number g, Number b, Number a) {
10271030
}
10281031

10291032
void OpenGLRenderer::EndRender() {
1033+
Renderer::EndRender();
10301034
/// glFlush();
10311035
// glFinish();
10321036
}

Core/Contents/Source/PolyRenderer.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,50 @@ Renderer::Renderer() : clearColor(0.2, 0.2, 0.2, 0.0), currentTexture(NULL), lig
5151
backingResolutionScaleX = 1.0;
5252
backingResolutionScaleY = 1.0;
5353
overrideMaterial = NULL;
54+
renderToGlobalFramebuffer = false;
55+
globalColorFramebuffer = NULL;
56+
globalDepthFramebuffer = NULL;
57+
}
58+
59+
void Renderer::setRenderToGlobalFramebuffer(bool val) {
60+
61+
if(val == renderToGlobalFramebuffer) {
62+
return;
63+
}
64+
65+
renderToGlobalFramebuffer = val;
66+
67+
if(renderToGlobalFramebuffer) {
68+
createRenderTextures(&globalColorFramebuffer, &globalDepthFramebuffer, getXRes(), getYRes(), false);
69+
} else {
70+
delete globalColorFramebuffer;
71+
delete globalDepthFramebuffer;
72+
}
73+
}
74+
75+
void Renderer::BeginRender() {
76+
if(renderToGlobalFramebuffer) {
77+
bindFrameBufferTexture(globalColorFramebuffer);
78+
bindFrameBufferTextureDepth(globalDepthFramebuffer);
79+
}
80+
}
81+
82+
void Renderer::EndRender() {
83+
if(renderToGlobalFramebuffer) {
84+
unbindFramebuffers();
85+
}
86+
}
87+
88+
bool Renderer::getRenderToGlobalFramebuffer() const {
89+
return renderToGlobalFramebuffer;
90+
}
91+
92+
Texture *Renderer::getGlobalColorFramebuffer() const {
93+
return globalColorFramebuffer;
94+
}
95+
96+
Texture *Renderer::getGlobalDepthFramebuffer() const {
97+
return globalDepthFramebuffer;
5498
}
5599

56100
void Renderer::setOverrideMaterial(Material *material) {

0 commit comments

Comments
 (0)