I found out the tricky code!
YOU MUST ATTACH the texture and your image~, see the code segment of
osgmultiplerendertargets.cpp from line 343 to 360:
for (int i=0; i<NUM_TEXTURES; i++) {
camera->attach(osg::Camera::BufferComponent(osg::Camera::COLOR_BUFFER0+i),
textureRect[i]);
}
// we can also read back any of the targets as an image, modify
this image and push it back
if (useImage) {
// which texture to get the image from
const int tex_to_get = 0;
osg::Image* image = new osg::Image;
if (useHDR) {
image->allocateImage(tex_width, tex_height, 1,
GL_RGBA, GL_FLOAT);
} else {
image->allocateImage(tex_width, tex_height, 1,
GL_RGBA, GL_UNSIGNED_BYTE);
}
// attach the image so its copied on each frame.
camera->attach(osg::Camera::BufferComponent(osg::Camera::COLOR_BUFFER0
+ tex_to_get), image);
That's OK!
hesicong2006 wrote:
Hi, Delport:
I tried your method, that's OK, I see the output. I'll check what's
wrong with my code or if there's some tricky code I ignore. Thanks!
J.P. Delport wrote:
Hi,
I have just edited osgmultiplerendertargets example and can confirm you
can get values > 1.
In the example, search for e-12 and change to e12 in the shader.
Run with:
osgmultiplerendertargets --hdr --image.
You will see that it prints values > 1.
jp
hesicong2006 wrote:
Hi, Robert:
I'm now writing shader to compute world coordinate of the scene and
save them as image. The value output by shader will exceed 1 and
require float values, so I use GL_RGBA32F_ARB for RTT texture. Since I
must save them to an image, I must allocate a Image and attach it to
the texture. My texture setup code is :
osg::ref_ptr<osg::Texture2D> texture=new osg::Texture2D();
osg::ref_ptr<osg::Image> image=new osg::Image;
image->allocateImage(1024,768 , 1, GL_RGBA, GL_FLOAT);
texture->setTextureSize(1024,768);
texture->setInternalFormat(GL_RGBA32F_ARB);
texture->setSourceFormat(GL_RGBA);
texture->setSourceType(GL_FLOAT);
texture->setResizeNonPowerOfTwoHint(false);
texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
texture->setImage(0, image.get());
And then I attach the image to camera:
camera=viewer->getCamera();
camera->setGraphicsContext(gc.get());
camera->setViewport(0,0,wWidth,wHeight);
camera->attach(osg::Camera::COLOR_BUFFER,
texture->getImage());
camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
But after I ran the program and saved the image, I found out the shader
output value which exceed 1 is clamped to 1! In order to check the
problem, I wrote a small callback to check it:
class VoxlizationPreDrawCallback : public osg::Camera::DrawCallback
{
public:
virtual void operator () (osg::RenderInfo& ) const
{
for(int y=0;y<768;y++)
{
for(int x=0;x<1024;x++)
{
float value=*(float*)imageToSave->data(x,y);
if(value>1)
{
std::cout<<"x="<<x<<"
y="<<y<<std::endl;
}
}
}
}
osg::Image* imageToSave;
};
But no value exceed 1. I changed the value>1 to value==1, it will
give me a lot of values.
I also tried if my shader can't output values above 1, I changed the
camera setting from
camera->attach(osg::Camera::COLOR_BUFFER,
texture->getImage());
to
camera->attach(osg::Camera::COLOR_BUFFER,
texture->get());
And I can see in GDebugger 4.2 frame buffer object, some values
actually above 1.
So I guess the process of camera writing values to osg::Image does not
support RGBA32 float format or it clamp the value to 1, float value
should not clamp to 1, it buggy!
Please check it! Thanks! And I also attached my little code and a box
model which size is (2*2*2) to help reproduce the problem.
Hesicong
2008-7-3
------------------------------------------------------------------------
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
__________ Information from ESET NOD32 Antivirus, version of virus
signature database 3236 (20080702) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
__________ Information from ESET NOD32 Antivirus, version of virus signature database 3236 (20080702) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
|