Added support for RGBA colour buffer in osgframerenderer using the --rgba command line option (--rgb selects the standard non colour frame buffer which is the default).

This commit is contained in:
Robert Osfield 2012-12-17 15:58:57 +00:00
parent f7bee82e99
commit c15d07caa1
6 changed files with 49 additions and 17 deletions

View File

@ -128,6 +128,8 @@ void setViewer(osgViewer::Viewer& viewer, float width, float height, float dista
// double hfov = osg::RadiansToDegrees(atan2(width/2.0f,distance)*2.0); // double hfov = osg::RadiansToDegrees(atan2(width/2.0f,distance)*2.0);
viewer.getCamera()->setProjectionMatrixAsPerspective( vfov, width/height, 0.1, 1000.0); viewer.getCamera()->setProjectionMatrixAsPerspective( vfov, width/height, 0.1, 1000.0);
OSG_NOTICE<<"setProjectionMatrixAsPerspective( "<<vfov<<", "<<width/height<<", "<<0.1<<", "<<1000.0<<");"<<std::endl;
} }
class ForwardToDeviceEventHandler : public osgGA::GUIEventHandler { class ForwardToDeviceEventHandler : public osgGA::GUIEventHandler {

View File

@ -157,7 +157,7 @@ REGISTER_OBJECT_WRAPPER( gsc_CaptureSettings,
ADD_ENUM_VALUE( OFF ); ADD_ENUM_VALUE( OFF );
ADD_ENUM_VALUE( HORIZONTAL_SPLIT ); ADD_ENUM_VALUE( HORIZONTAL_SPLIT );
ADD_ENUM_VALUE( VERTICAL_SPLIT ); ADD_ENUM_VALUE( VERTICAL_SPLIT );
END_ENUM_SERIALIZER(); // _renderTargetImplementation END_ENUM_SERIALIZER();
ADD_BOOL_SERIALIZER( Offscreen, false ); ADD_BOOL_SERIALIZER( Offscreen, false );
ADD_BOOL_SERIALIZER( OutputImageFlip, false ); ADD_BOOL_SERIALIZER( OutputImageFlip, false );
@ -169,6 +169,11 @@ REGISTER_OBJECT_WRAPPER( gsc_CaptureSettings,
ADD_FLOAT_SERIALIZER( ScreenHeight, 0.0 ); ADD_FLOAT_SERIALIZER( ScreenHeight, 0.0 );
ADD_FLOAT_SERIALIZER( ScreenDistance, 0.0 ); ADD_FLOAT_SERIALIZER( ScreenDistance, 0.0 );
BEGIN_ENUM_SERIALIZER( PixelFormat, RGB );
ADD_ENUM_VALUE( RGB );
ADD_ENUM_VALUE( RGBA );
END_ENUM_SERIALIZER();
ADD_UINT_SERIALIZER( Samples, 0 ); ADD_UINT_SERIALIZER( Samples, 0 );
ADD_UINT_SERIALIZER( SampleBuffers, 0 ); ADD_UINT_SERIALIZER( SampleBuffers, 0 );

View File

@ -60,6 +60,16 @@ public:
void setScreenDistance(float distance) { _screenDistance = distance; } void setScreenDistance(float distance) { _screenDistance = distance; }
float getScreenDistance() const { return _screenDistance; } float getScreenDistance() const { return _screenDistance; }
enum PixelFormat
{
RGB,
RGBA
};
void setPixelFormat(PixelFormat format) { _pixelFormat = format; }
PixelFormat getPixelFormat() const { return _pixelFormat; }
void setSamples(unsigned int s) { _samples = s; } void setSamples(unsigned int s) { _samples = s; }
unsigned int getSamples() const { return _samples; } unsigned int getSamples() const { return _samples; }
@ -121,6 +131,7 @@ protected:
float _screenHeight; float _screenHeight;
float _screenDistance; float _screenDistance;
PixelFormat _pixelFormat;
unsigned int _samples; unsigned int _samples;
unsigned int _sampleBuffers; unsigned int _sampleBuffers;

View File

@ -17,7 +17,8 @@
struct ScreenShot : public osg::Camera::DrawCallback struct ScreenShot : public osg::Camera::DrawCallback
{ {
ScreenShot(bool flip): ScreenShot(GLenum pixelFormat, bool flip):
_pixelFormat(pixelFormat),
_flip(flip) {} _flip(flip) {}
virtual void operator () (osg::RenderInfo& renderInfo) const virtual void operator () (osg::RenderInfo& renderInfo) const
@ -41,13 +42,13 @@ struct ScreenShot : public osg::Camera::DrawCallback
osg::Viewport* viewport = camera ? camera->getViewport() : 0; osg::Viewport* viewport = camera ? camera->getViewport() : 0;
if (viewport) if (viewport)
{ {
OSG_NOTICE<<"Doing read of ="<<viewport->x()<<", "<<viewport->y()<<", "<<viewport->width()<<", "<<viewport->height()<<std::endl; OSG_NOTICE<<"Doing read of ="<<viewport->x()<<", "<<viewport->y()<<", "<<viewport->width()<<", "<<viewport->height()<<" with pixelFormat=0x"<<std::hex<<_pixelFormat<<std::dec<<std::endl;
glReadBuffer(camera->getDrawBuffer()); glReadBuffer(camera->getDrawBuffer());
osg::ref_ptr<osg::Image> image = new osg::Image; osg::ref_ptr<osg::Image> image = new osg::Image;
image->readPixels(viewport->x(),viewport->y(),viewport->width(),viewport->height(), image->readPixels(viewport->x(),viewport->y(),viewport->width(),viewport->height(),
GL_RGB, GL_UNSIGNED_BYTE, 1); _pixelFormat, GL_UNSIGNED_BYTE, 1);
if (_flip) image->flipVertical(); if (_flip) image->flipVertical();
@ -58,6 +59,7 @@ struct ScreenShot : public osg::Camera::DrawCallback
typedef std::map<const osg::Camera*, unsigned int> CameraNumMap; typedef std::map<const osg::Camera*, unsigned int> CameraNumMap;
GLenum _pixelFormat;
bool _flip; bool _flip;
osg::ref_ptr<gsc::CaptureSettings> _frameCapture; osg::ref_ptr<gsc::CaptureSettings> _frameCapture;
CameraNumMap _cameraNumMap; CameraNumMap _cameraNumMap;
@ -239,6 +241,11 @@ int main( int argc, char **argv )
unsigned int height = 512; unsigned int height = 512;
if (arguments.read("--height",height)) fc->setHeight(height); if (arguments.read("--height",height)) fc->setHeight(height);
if (arguments.read("--rgb")) fc->setPixelFormat(gsc::CaptureSettings::RGB);
if (arguments.read("--rgba")) fc->setPixelFormat(gsc::CaptureSettings::RGBA);
osg::Vec4 clearColor(0.0f,0.0f,0.0f,0.0f);
while (arguments.read("--clear-color",clearColor[0],clearColor[1],clearColor[2],clearColor[3])) {}
unsigned int samples = 0; unsigned int samples = 0;
@ -380,6 +387,7 @@ int main( int argc, char **argv )
traits->y = 0; traits->y = 0;
traits->width = fc->getWidth(); traits->width = fc->getWidth();
traits->height = fc->getHeight(); traits->height = fc->getHeight();
traits->alpha = (fc->getPixelFormat() == gsc::CaptureSettings::RGBA) ? 8 : 0;
traits->samples = fc->getSamples(); traits->samples = fc->getSamples();
traits->sampleBuffers = fc->getSampleBuffers(); traits->sampleBuffers = fc->getSampleBuffers();
traits->windowDecoration = !(fc->getOffscreen()); traits->windowDecoration = !(fc->getOffscreen());
@ -394,7 +402,7 @@ int main( int argc, char **argv )
return 1; return 1;
} }
viewer.getCamera()->setClearColor(clearColor);
viewer.getCamera()->setGraphicsContext(gc.get()); viewer.getCamera()->setGraphicsContext(gc.get());
viewer.getCamera()->setDisplaySettings(ds.get()); viewer.getCamera()->setDisplaySettings(ds.get());
@ -417,6 +425,10 @@ int main( int argc, char **argv )
// double hfov = osg::RadiansToDegrees(atan2(width/2.0f,distance)*2.0); // double hfov = osg::RadiansToDegrees(atan2(width/2.0f,distance)*2.0);
viewer.getCamera()->setProjectionMatrixAsPerspective( vfov*fovy_multiple, (screenWidth/screenHeight)*fovx_multiple, 0.1, 1000.0); viewer.getCamera()->setProjectionMatrixAsPerspective( vfov*fovy_multiple, (screenWidth/screenHeight)*fovx_multiple, 0.1, 1000.0);
OSG_NOTICE<<"setProjectionMatrixAsPerspective( "<<vfov*fovy_multiple<<", "<<(screenWidth/screenHeight)*fovx_multiple<<", "<<0.1<<", "<<1000.0<<");"<<std::endl;
} }
else else
{ {
@ -467,12 +479,14 @@ int main( int argc, char **argv )
} }
} }
GLenum pixelFormat = (fc->getPixelFormat()==gsc::CaptureSettings::RGBA) ? GL_RGBA : GL_RGB;
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
viewer.realize(); viewer.realize();
// set up screen shot // set up screen shot
osg::ref_ptr<ScreenShot> screenShot = new ScreenShot(fc->getOutputImageFlip());; osg::ref_ptr<ScreenShot> screenShot = new ScreenShot(pixelFormat, fc->getOutputImageFlip());;
{ {
osgViewer::Viewer::Cameras cameras; osgViewer::Viewer::Cameras cameras;

View File

@ -41,15 +41,15 @@ class ReaderWriterP3DXML : public osgDB::ReaderWriter
public: public:
ReaderWriterP3DXML() ReaderWriterP3DXML()
{ {
_colorMap["WHITE"] .set(1.0f,1.0f,1.0f,1.0f); _colorMap["WHITE"] .set(1.0f,1.0f,1.0f,0.0f);
_colorMap["BLACK"] .set(0.0f,0.0f,0.0f,1.0f); _colorMap["BLACK"] .set(0.0f,0.0f,0.0f,0.0f);
_colorMap["PURPLE"] .set(1.0f,0.0f,1.0f,1.0f); _colorMap["PURPLE"] .set(1.0f,0.0f,1.0f,0.0f);
_colorMap["BLUE"] .set(0.0f,0.0f,1.0f,1.0f); _colorMap["BLUE"] .set(0.0f,0.0f,1.0f,0.0f);
_colorMap["RED"] .set(1.0f,0.0f,0.0f,1.0f); _colorMap["RED"] .set(1.0f,0.0f,0.0f,0.0f);
_colorMap["CYAN"] .set(0.0f,1.0f,1.0f,1.0f); _colorMap["CYAN"] .set(0.0f,1.0f,1.0f,0.0f);
_colorMap["YELLOW"] .set(1.0f,1.0f,0.0f,1.0f); _colorMap["YELLOW"] .set(1.0f,1.0f,0.0f,0.0f);
_colorMap["GREEN"] .set(0.0f,1.0f,0.0f,1.0f); _colorMap["GREEN"] .set(0.0f,1.0f,0.0f,0.0f);
_colorMap["SKY"] .set(0.2f, 0.2f, 0.4f, 1.0f); _colorMap["SKY"] .set(0.2f, 0.2f, 0.4f, 0.0f);
_layoutMap["LEFT_TO_RIGHT"] = osgText::Text::LEFT_TO_RIGHT; _layoutMap["LEFT_TO_RIGHT"] = osgText::Text::LEFT_TO_RIGHT;
_layoutMap["RIGHT_TO_LEFT"] = osgText::Text::RIGHT_TO_LEFT; _layoutMap["RIGHT_TO_LEFT"] = osgText::Text::RIGHT_TO_LEFT;

View File

@ -168,7 +168,7 @@ SlideShowConstructor::SlideShowConstructor(osgDB::Options* options):
_hudSettings = new HUDSettings(_slideDistance, ds->getEyeSeparation()*0.5, _leftEyeMask, _rightEyeMask); _hudSettings = new HUDSettings(_slideDistance, ds->getEyeSeparation()*0.5, _leftEyeMask, _rightEyeMask);
_backgroundColor.set(0.0f,0.0f,0.0f,1.0f); _backgroundColor.set(0.0f,0.0f,0.0f,0.0f);
_presentationDuration = -1.0; _presentationDuration = -1.0;