Hi guys! I try to implement HDR. And I got some problem when I compute average luminance
I have to render it to 1X1 texture and here is the main problem When I setup viewport with setVewport(0,0,1,1) - I've got clearcolor i.e. (1,0,0,0) When I setup viewport with setVewport(0,0,2,2) - I've got average luminance - but here I've got 2X2 texture but I need 1X1 texture What should I do? Here is my source (luminance2 texture has size of 4X4) osg::ref_ptr<osg::Texture2D> finalluminance = new osg::Texture2D; finalluminance->setTextureSize( 2, 2); finalluminance->setInternalFormat(GL_RGBA16F_ARB); finalluminance->setSourceFormat(GL_RGBA); finalluminance->setSourceType(GL_FLOAT); finalluminance->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR) ; finalluminance->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR) ; finalluminance->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP); finalluminance->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP); osg::ref_ptr<osg::Camera> luminance3Camera = new osg::Camera; osg::ref_ptr<osg::Geode> geode = new osg::Geode; osg::ref_ptr<osg::Geometry> geom =osg::createTexturedQuadGeometry(osg::Vec3(0,0,-1),osg::Vec3(1.0,0.0,-1.0),o sg::Vec3(0.0,1.0,-1.0)); geom->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF); geode->addDrawable(geom.get()); luminance3Camera->setName("luminance3"); luminance3Camera->setClearColor(osg::Vec4f(1.0f,0.0f,0.0f,1.0f)); luminance3Camera->setProjectionMatrix(osg::Matrix::ortho2D(0,1,0,1)); luminance3Camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); luminance3Camera->setViewMatrix(osg::Matrix::identity()); luminance3Camera->setViewport(0,0,2,2); luminance3Camera->setRenderOrder(osg::Camera::POST_RENDER,13); luminance3Camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OB JECT); luminance3Camera->attach(osg::Camera::COLOR_BUFFER,finalluminance.get()); luminance3Camera->addChild(geode.get()); osg::ref_ptr<osg::StateSet> luminance3stateset =luminance3Camera->getOrCreateStateSet(); luminance3stateset->setTextureAttributeAndModes(0,luminance2.get(),osg::Stat eAttribute::ON); luminance3stateset->setAttribute(clamp, osg::StateAttribute::ON); root->addChild(luminance3Camera.get()); osg::Program* luminance3prg = new osg::Program; luminance3stateset->setAttribute(luminance3prg); luminance3prg->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, osgDB::findDataFile("Shaders/downLumExp_vp.glsl"))); luminance3prg->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile("Shaders/downLumExp.glsl"))); osg::Uniform* DownSampler = new osg::Uniform("DownSampler",0); luminance3stateset->addUniform(DownSampler); here is downLumExp.glsl /*FRAGMENT_SHADER*/ uniform sampler2D DownSampler; const vec2 samples[16]={ -0.375, -0.375, -0.125, -0.375, 0.125, -0.375, 0.375, -0.375, -0.375, -0.125, -0.125, -0.125, 0.125, -0.125, 0.375, -0.125, -0.375, 0.125, -0.125, 0.125, 0.125, 0.125, 0.375, 0.125, -0.375, 0.375, -0.125, 0.375, 0.125, 0.375, 0.375, 0.375 }; void main(void) { float lum = 0.0; float maximum = 0.0; vec4 color; vec2 sample; for(int i = 0; i < 16; i++) { sample = vec2(samples[i].x,samples[i].y); color = texture2D(DownSampler, gl_TexCoord[0].xy + sample); maximum = max( maximum, color.g ); lum += color.r; } lum *= 0.0625; lum = exp(lum); gl_FragColor = vec4(lum, maximum, 0.0, 1.0); }
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org