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

Reply via email to