<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<style type="text/css">
<!--

/*
  The original subSilver Theme for phpBB version 2+
  Created by subBlue design
  http://www.subBlue.com

  NOTE: These CSS definitions are stored within the main page body so that you can use the phpBB2
  theme administration centre. When you have finalised your style you could cut the final CSS code
  and place it in an external file, deleting this section to save bandwidth.
*/


 /* General page style. The scroll bar colours only visible in IE5.5+ */
body {
        background-color: #E5E5E5;
        font-family: Verdana, Arial, Helvetica, sans-serif;
        font-size: 11;
        color: #000000;
}

/* General font families for common tags */
font,th,td,p { font-family: Verdana, Arial, Helvetica, sans-serif }
p, td           { font-size : 11; color : #000000; }
a:link,a:active,a:visited { color : #006699; }
a:hover         { text-decoration: underline; color : #DD6900; }
hr      { height: 0px; border: solid #D1D7DC 0px; border-top-width: 1px;}
h1,h2           { font-family: "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; font-size : 22px; font-weight : bold; text-decoration : none; line-height : 120%; color : #000000;}


/* This is the border line & background colour round the entire page */
.bodyline       { background-color: #FFFFFF; border: 1px #98AAB1 solid; }


/* General text */
.gen { font-size : 12px; }
.genmed { font-size : 11px; }
.gensmall { font-size : 10px; line-height: 12px}
.gen,.genmed,.gensmall { color : #000000; }
a.gen,a.genmed,a.gensmall { color: #006699; text-decoration: none; }
a.gen:hover,a.genmed:hover,a.gensmall:hover     { color: #DD6900; text-decoration: underline; }


/* Forum title: Text and link to the forums used in: index.php */
.forumlink              { font-weight: bold; font-size: 12px; color : #006699; }
a.forumlink     { text-decoration: none; color : #006699; }
a.forumlink:hover{ text-decoration: underline; color : #DD6900; }


/* The content of the posts (body of text) */
.postbody { font-size : 12px; line-height: 18px}
a.postlink:link { text-decoration: none; color : #006699 }
a.postlink:visited { text-decoration: none; color : #5493B4; }
a.postlink:hover { text-decoration: underline; color : #DD6900}


/* Quote & Code blocks */
.code {
        font-family: Courier, 'Courier New', sans-serif; font-size: 11px; color: #006600;
        background-color: #FAFAFA; border: #D1D7DC; border-style: solid;
        border-left-width: 1px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px
}

.quote {
        font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #444444; line-height: 125%;
        background-color: #FAFAFA; border: #D1D7DC; border-style: solid;
        border-left-width: 1px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px
}

-->
</style>
</head>
        <body>

        <div class="postbody">I managed to solve this issue using the following code:<br />
<br />
</span><table class="bodyline" width="90%" cellspacing="1" cellpadding="3" border="0" align="center"><tr>                 <td class="helpline"><span class="genmed"><b>Code:</b><br /> <script type="text/javascript" src="./templates/select_expand_bbcodes.js"></script><br /> <script type="text/javascript"><br /> <br /> <!--<br /> <br />         var id = 'SXBB' + (1000 + Math.floor(Math.random() * 5000));<br />         SXBB[id] = new _SXBB(id);<br />         SXBB[id].T['select'] = 'Select';<br />         SXBB[id].T['expand'] = 'Expand';<br />         SXBB[id].T['contract'] = 'Contract';<br />         SXBB[id].writeCmd();<br /> <br /> //--><br /> <br /> </script><br />                 </span></td><br />         </tr><br />         <tr><br />           <td class="code"><br /> <script type="text/javascript"><br /> <br /> <!--<br /> <br />         SXBB[id].writeDiv();<br /> <br /> //--><br /> <br /> </script><br />
// create a camera to set up the projection and model view matrices, and the subgraph to draw in the HUD<br />
osg::ref_ptr<osg::Camera> camera = new osg::Camera();<br />
<br />
// set the view matrix<br />
camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);<br />
// use identity view matrix so that children do not get (view) transformed<br />
camera->setViewMatrix(osg::Matrix::identity());<br />
// set the projection matrix to be of width and height of 1<br />
camera->setProjectionMatrix(osg::Matrix::ortho2D(0, 1.0f, 0, 1.0f));<br />
// set resize policy to fixed<br />
camera->setProjectionResizePolicy(osg::Camera::ProjectionResizePolicy::FIXED);<br />
<br />
// only clear the depth buffer<br />
camera->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);<br />
<br />
// draw subgraph before main camera view.<br />
camera->setRenderOrder(osg::Camera::NESTED_RENDER);<br />
<br />
// we don't want the camera to grab event focus from the viewers main camera(s).<br />
camera->setAllowEventFocus(false);<br />
<br />
osg::StateSet* cameraStateSet = camera->getOrCreateStateSet();<br />
cameraStateSet->setRenderBinDetails(1, "RenderBin");<br />
cameraStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);<br />
<br />
// add to this camera a subgraph to render<br />
{<br />
<br />
    osg::ref_ptr<osg::Geode> geode{ new osg::Geode() };<br />
<br />
    auto stateset = geode->getOrCreateStateSet();<br />
    stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);<br />
    {<br />
        auto backgroundImage = osgDB::readImageFile("data/images/bg_ragnarok_01.bmp");<br />
        auto texturedQuad = osg::createTexturedQuadGeometry(<br />
            osg::Vec3(0.f, 0.f, 0.f),<br />
            osg::Vec3(1.0f, 0.f, 0.f),<br />
            osg::Vec3(0.f, 1.0f, 0.f),<br />
            0.f,<br />
            0.f,<br />
            backgroundImage->s(),<br />
            backgroundImage->t());<br />
        auto textureRect = new osg::TextureRectangle(backgroundImage); textureRect->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);<br />
        textureRect->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);<br />
        textureRect->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);<br />
        textureRect->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);<br />
        texturedQuad->getOrCreateStateSet()->setTextureAttributeAndModes(0, textureRect, osg::StateAttribute::ON);<br />
        texturedQuad->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);<br />
        geode->addDrawable(texturedQuad);<br />
    }<br />
<br />
    if (!camera->addChild(geode))<br />
    {<br />
        osg::notify(osg::NotifySeverity::WARN) << "Failed to add geode" << std::endl;<br />
    }<br />
}<br />
osgViewer::Viewer::Windows windows;<br />
viewer.getWindows(windows);<br />
<br />
if (windows.empty())<br />
{<br />
    return;<br />
}<br />
<br />
// set up cameras to render on the first window available.<br />
auto window = windows[0];<br />
camera->setGraphicsContext(window);<br />
auto windowTraits = window->getTraits();<br />
camera->setViewport(0, 0, windowTraits->width, windowTraits->height);<br />
<br />
auto group = dynamic_cast<osg::Group*>(viewer.getSceneData());<br />
if (nullptr == group)<br />
{<br />
    osg::notify(osg::NotifySeverity::WARN) << "Failed to add camera" << std::endl;<br />
    return;<br />
}<br />
group->addChild(camera.get());<br />
<br /> <script type="text/javascript"><br /> <br /> <!--<br /> <br />         document.write('</div>');<br /> <br /> //--><br /> <br /> </script><br />                 </td><br />         </tr></table><span class="postbody"><br />
<br />
The gist of the code is:<br />
<ul><br />
1. Create a camera<br />
2. Set the view matrix of the camera to identity so that there are no view transforms made to the children<br />
3. Set the projection matrix of the camera to be of an orthogonal matrix with width and height equal to 1<br />
4. Set resize policy on projection matrix to be fixed<br />
5. Set render order to be NESTED_RENDER (I previously had this as PRE_RENDER and that didn't work. I still have to dig into why).<br />
6. Create a textured quad with width and height of 1 unit<br />
7. Add the textured quad to an instance of osg::Geode and add that geode to the camera<br />
8. Extract the first window from the camera. Set the graphics-context and viewport of the camera<br />
9. Add the camera to the scene and you have a background image<br />
</ul><br />
<br />
This answer can also be found in gamedev section of stackexchange. Since I cannot add links to my posts yet, I'm skipping that. But it should be easy to find if you search my username.<br />
<br />
Thanks to everyone who took a look at this question.</div>
        <br /><div class="gensmall">------------------<br />
Read this topic online here:<br />
<a href="http://forum.openscenegraph.org/viewtopic.php?p=65658#65658" target="_blank">http://forum.openscenegraph.org/viewtopic.php?p=65658#65658</a><br />
<br />
</div>
        </body>
</html>