diff --git a/shaders/forward.frag.glsl b/shaders/forward.frag.glsl index f795f3b..611109b 100644 --- a/shaders/forward.frag.glsl +++ b/shaders/forward.frag.glsl @@ -55,7 +55,7 @@ uniform float attenuation; #endif layout(location = 0)out vec4 outColor; -layout(location = 1)out vec4 pickData; +layout(location = 1)out vec3 pickData; vec3 phongLighting(in vec3 kd, in vec3 ks, in float ns, in vec3 color, in vec3 normal, in vec3 lightDir, in vec3 halfVec){ float diffuseComponent = max(dot(normal, lightDir), 0); @@ -119,12 +119,12 @@ void main(void) { #endif #ifdef INSTANCING - pickData = vec4(gl_FragCoord.z, gl_FragCoord.w, float(int(objectId) + instanceId), 0); + pickData = vec3(gl_FragCoord.z, gl_FragCoord.w, float(int(objectId) + instanceId)); #else - pickData = vec4(gl_FragCoord.z, gl_FragCoord.w, float(objectId), 0); + pickData = vec3(gl_FragCoord.z, gl_FragCoord.w, float(objectId)); #endif #ifndef AMBIENT_LIGHT - pickData = vec4(0); + pickData = vec3(0); #endif } diff --git a/src/posteffectmodule.cpp b/src/posteffectmodule.cpp index 46231b1..a0112d0 100644 --- a/src/posteffectmodule.cpp +++ b/src/posteffectmodule.cpp @@ -72,6 +72,10 @@ void PostEffectModule::resize(int w, int h) tex = new Texture(GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, width, height, GL_FLOAT, GL_TEXTURE_RECTANGLE); frameBuffers[INPUT_FBO].addTexture(tex, GL_DEPTH_ATTACHMENT); + // Picking texture + tex = new Texture(GL_RGB, GL_RGB32F, width, height, GL_FLOAT, GL_TEXTURE_RECTANGLE); + frameBuffers[INPUT_FBO].addTexture(tex, GL_COLOR_ATTACHMENT1); + frameBuffers[INPUT_FBO].initColorAttachments(); @@ -122,10 +126,13 @@ void PostEffectModule::renderGL(Camera* myCamera, Scene* scene) glAssert(glBindVertexArray(vao)); + // threasholding the luminance to isolate high luminance pixels for bloom luminanceStep(); + // blur the high luminance pixels bloomStep(); + // compute average luminance and apply tonemapping hdrStep(); glAssert(glEnable(GL_DEPTH_TEST)); @@ -218,6 +225,17 @@ void PostEffectModule::setShaders(const std::string &luminanceFragSource, } +glm::vec3 PostEffectModule::getObjectInfo(int x, int y) +{ + fbo->getTexture(1)->bind(0); + glm::vec3 *val = new glm::vec3[w*h]; + glAssert(glGetTexImage(GL_TEXTURE_RECTANGLE, 0, GL_RGB, GL_FLOAT, val)); + glm::vec3 ret = val[x + (h-y)*w]; + ret.z -= 1; // clearColor compensation + delete[] val; + return ret; +} + const std::string PostEffectModule::vertSource = "layout(location = 0)in vec2 inPosition;\n\ void main(void) {\n\ diff --git a/src/posteffectmodule.h b/src/posteffectmodule.h index 429423f..b1cf8a4 100644 --- a/src/posteffectmodule.h +++ b/src/posteffectmodule.h @@ -81,6 +81,8 @@ public: void setRenderTarget(FrameBuffer* renderTarget) {outputFBO = renderTarget;} void setBloomThreshold(float threshold) {bloom_threshold = threshold;} + + glm::vec3 getObjectInfo(int x, int y); }; #endif // POSTEFFECTMODULE_H