an openFrameworks addon for shading, lighting, lens simulation.
Here is demo.
I was satisfied with ofxPostPrpcessing long time, which is fabulous and has so many beautiful vfx in it. I really appreciate the author and contributors.
But there is little problem when I use my own shaders with it. It is not written in "modern" shader version so cannot coexist with the "programmble renderer".
At this moment, however we have to decide to abandon legacy but helpful functions including ofLight
, glBegin()
-glEnd()
...
And the addon mentioned above has only few effects for photo-real purpose such like "casting shadow". So I decided to reproduce and regather PostProcesses focusing "photo-real" rendering and compatible in modern version.
Now it contains
int main( ){
ofGLWindowSettings settings;
settings.setGLVersion(4, 1); // now we use OpenGL 4.1
settings.setSize(1024, 768);
ofCreateWindow(settings);
ofRunApp(new ofApp());
}
std::shared_ptr
// declare in ofApp.h
ofxDeferredProcessing deferred;
ofPtr<ofxDeferred::SsaoPass> ssao;
ofPtr<ofxDeferred::PointLightPass> points;
ofPtr<ofxDeferred::ShadowLightPass> shadow;
ofPtr<ofxDeferred::HdrBloomPass> bloom;
...
deferred.init(ofGetWidth(), ofGetHeight());
ssao = deferred.createPass<ofxDeferred::SsaoPass>();
points = deferred.createPass<ofxDeferred::PointLightPass>();
shadow = deferred.createPass<ofxDeferred::ShadowLightPass>();
bloom = deferred.createPass<ofxDeferred::HdrBloomPass>();
ssao->setOcculusionRadius(5.0);
ssao->setDarkness(1.0);
draw objects between begin()
and end()
.
If you want to HDR color, just specify vertex color bright enough (can be more than 1.0) through ofFloatColor
's parameters.
if you want to use cast shadow (ShadowLightPass
), you need another draw call for shadow map.
// for shadow map
shadowLightPass->beginShadowMap();
drawObjs(); // draw something
lightPass->drawLights(); // draw light bulbs
shadowLightPass->endShadowMap();
// for rendering pass
deferred.begin(cam);
drawObjs(); // exactly the same call above
lightPass->drawLights();
deferred.end();
Also, you can use own shader for mesh rendering. In this case, you need to write pixel data into color buffer properly like below.
#version 400
uniform int shadowFlag;
in vec4 vPos;
in vec4 vNormal;
in vec4 vColor;
in float vDepth;
layout (location = 0) out vec4 outputColor0; // Color
layout (location = 1) out vec4 outputColor1; // Position
layout (location = 2) out vec4 outputColor2; // Normal and Depth
void main(){
if (shadowFlag == 1) {
outputColor0.r = vDepth;
outputColor0.a = 1.;
} else {
outputColor0 = vColor;
outputColor1 = vPos;
outputColor2 = vec4(vNormal.xyz, vDepth);
}
}