Hi Mike,
You can set the internal texture format via :
texture-setInternalFormat(internalformat);
In you case setInternalFormat(GL_BGRA) might just do the trick.
As for the most efficient way to do what you are doing you'll want to
attach an osg::PixelBufferObject to a single osg::Image, and then do a
setData on this single image. This way the OSG can use the pixel
buffer object extension to stream the data to the texture. You'd also
best do all reading in a background thread as per the xine-lib and
quicktime plugins.
Robert.
On Fri, May 23, 2008 at 1:29 PM, Mike Greene [EMAIL PROTECTED] wrote:
Hi,
I have the following simple program (modified texture rectangle sample).
I'm reading a set of large (1920x1080) bitmaps from disk and swapping each
callback loop. My problem is that the bmps need to be in BGRA instead of
RGBA format. Can I change the TextureRectangle in OSG to compensate for
this?
Mike Greene
//code
#include osg/Notify
#include osg/TextureRectangle
#include osg/Geometry
#include osg/Geode
#include osg/TexMat
#include osg/Group
#include osg/Projection
#include osg/MatrixTransform
#include osgText/Text
#include osgDB/Registry
#include osgDB/ReadFile
#include osgViewer/Viewer
osg::Image* img = new osg::Image();
osg::TextureRectangle* texture = new osg::TextureRectangle();
long texturecounter = 0;
class TextureChangeCallback : public osg::NodeCallback
{
public:
TextureChangeCallback(
double delay = 0.05) :
_phaseS(35.0f),
_phaseT(18.0f),
_phaseScale(5.0f),
_delay(delay),
_prevTime(0.0)
{
}
virtual void operator()(osg::Node*, osg::NodeVisitor* nv)
{
if (texturecounter == 0) img =
osgDB::readImageFile(c:\\mgreene\\data\\mach00.bmp);
if (texturecounter == 1) img =
osgDB::readImageFile(c:\\mgreene\\data\\mach01.bmp);
if (texturecounter == 2) img =
osgDB::readImageFile(c:\\mgreene\\data\\mach02.bmp);
if (texturecounter == 3) img =
osgDB::readImageFile(c:\\mgreene\\data\\mach03.bmp);
if (texturecounter == 4) img =
osgDB::readImageFile(c:\\mgreene\\data\\mach04.bmp);
if (texturecounter == 5) img =
osgDB::readImageFile(c:\\mgreene\\data\\mach05.bmp);
texture-setImage(img);
texturecounter+=1;
if (texturecounter == 6) texturecounter = 0;
}
private:
float _phaseS, _phaseT, _phaseScale;
double _delay;
double _prevTime;
};
int main(int argc, char** argv)
{
// use an ArgumentParser object to manage the program arguments.
osg::ArgumentParser arguments(argc,argv);
osg::Group* root = new osg::Group;
osg::BoundingBox bb(0.0f,0.0f,0.0f,1.0f,1.78f,1.78f);
/
osg::Vec3 top_left(bb.xMin(),bb.yMax(),bb.zMax());
osg::Vec3 bottom_left(bb.xMin(),bb.yMax(),bb.zMin());
osg::Vec3 bottom_right(bb.xMax(),bb.yMax(),bb.zMin());
osg::Vec3 top_right(bb.xMax(),bb.yMax(),bb.zMax());
// create geometry
osg::Geometry* geom = new osg::Geometry;
osg::Vec3Array* vertices = new osg::Vec3Array(4);
(*vertices)[0] = top_left;
(*vertices)[1] = bottom_left;
(*vertices)[2] = bottom_right;
(*vertices)[3] = top_right;
geom-setVertexArray(vertices);
osg::Vec2Array* texcoords = new osg::Vec2Array(4);
(*texcoords)[0].set(0.0f, 0.0f);
(*texcoords)[1].set(1.0f, 0.0f);
(*texcoords)[2].set(1.0f, 1.0f);
(*texcoords)[3].set(0.0f, 1.0f);
geom-setTexCoordArray(0,texcoords);
osg::Vec3Array* normals = new osg::Vec3Array(1);
(*normals)[0].set(0.0f,-1.0f,0.0f);
geom-setNormalArray(normals);
geom-setNormalBinding(osg::Geometry::BIND_OVERALL);
osg::Vec4Array* colors = new osg::Vec4Array(1);
(*colors)[0].set(1.0f,1.0f,1.0f,1.0f);
geom-setColorArray(colors);
geom-setColorBinding(osg::Geometry::BIND_OVERALL);
geom-addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));
// disable display list so our modified tex coordinates show up
geom-setUseDisplayList(false);
// load image
img = osgDB::readImageFile(c:\\mgreene\\data\\mach00.bmp);
// setup texture
texture-setImage(img);
osg::TexMat* texmat = new osg::TexMat;
texmat-setScaleByTextureRectangleSize(true);
// setup state
osg::StateSet* state = geom-getOrCreateStateSet();
state-setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
state-setTextureAttributeAndModes(0, texmat, osg::StateAttribute::ON);
// turn off lighting
state-setMode(GL_LIGHTING, osg::StateAttribute::OFF);
// install 'update' callback
osg::Geode* geode = new osg::Geode;
geode-addDrawable(geom);
geode-setUpdateCallback(new TextureChangeCallback());
//
root-addChild(geode);
// construct the viewer.
osgViewer::Viewer viewer;
// create a model from the images.
osg::Node* rootNode = root;//createModel((arguments.argc() 1 ?
arguments[1] :