Hi,
I've met a very strange problem when I tried to set mipmaps in a osg::Image
object.
If I use the sample code in osgParticle/PrecipitationEffect.cpp, I can get
correct mipmap texture, however, if I try to read texture data from files to
set mipmap texture, it didn't work. I'll be mad, somebody met this problem
before? help~~~~~~
p.s.
sample code(texturemipmaps.cpp) : change from
osgParticle/PrecipitationEffect.cpp and work well
my code(Mymipmap.cpp): could not work appropriately, with no texture on
that plane......
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Texture2D>
#include <osg/Geometry>
#include <osg/Geode>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
osg::ref_ptr<osg::Geometry> createPlane( float length, float width )
{
osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;
vec->resize( 8 );
(*vec)[0] = osg::Vec3f( -2, 0, -2 );
(*vec)[1] = osg::Vec3f( -2, 0, 2 );
(*vec)[2] = osg::Vec3f( 2, 0, 2 );
(*vec)[3] = osg::Vec3f( 2, 0, -2 );
osg::ref_ptr<osg::Vec3Array> nor = new osg::Vec3Array;
nor->push_back( osg::Vec3f( 0.0, -1.0, 0.0 ) );
osg::ref_ptr<osg::Vec2Array> tex = new osg::Vec2Array;
tex->push_back( osg::Vec2f(0.0, 0.0) );
tex->push_back( osg::Vec2f(0.0, 1.0) );
tex->push_back( osg::Vec2f(1.0, 1.0) );
tex->push_back( osg::Vec2f(1.0, 0.0) );
osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
geo->setVertexArray( vec.get() );
geo->setTexCoordArray( 0, tex.get() );
geo->setNormalArray( nor.get() );
geo->setNormalBinding( osg::Geometry::BIND_PER_PRIMITIVE_SET );
geo->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0,
4 ) );
return geo;
}
static void fillSpotLightImage(unsigned char* ptr, const osg::Vec4&
centerColour, const osg::Vec4& backgroudColour, unsigned int size, float power)
{
if (size==1)
{
float r = 0.5f;
osg::Vec4 color = centerColour*r+backgroudColour*(1.0f-r);
*ptr++ = (unsigned char)((color[0])*255.0f);
*ptr++ = (unsigned char)((color[1])*255.0f);
*ptr++ = (unsigned char)((color[2])*255.0f);
*ptr++ = (unsigned char)((color[3])*255.0f);
return;
}
float mid = (float(size)-1.0f)*0.5f;
float div = 2.0f/float(size);
for(unsigned int r=0;r<size;++r)
{
//unsigned char* ptr = image->data(0,r,0);
for(unsigned int c=0;c<size;++c)
{
float dx = (float(c) - mid)*div;
float dy = (float(r) - mid)*div;
float r = powf(1.0f-sqrtf(dx*dx+dy*dy),power);
if (r<0.0f) r=0.0f;
osg::Vec4 color =
centerColour*r+backgroudColour*(1.0f-r);
*ptr++ = (unsigned char)((color[0])*255.0f);
*ptr++ = (unsigned char)((color[1])*255.0f);
*ptr++ = (unsigned char)((color[2])*255.0f);
*ptr++ = (unsigned char)((color[3])*255.0f);
}
}
}
int main(int, char **)
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::PositionAttitudeTransform> mypat1 = new
osg::PositionAttitudeTransform;
osg::ref_ptr<osg::PositionAttitudeTransform> mypat2 = new
osg::PositionAttitudeTransform;
osg::ref_ptr<osg::Geode> mygeode1 = new osg::Geode;
osg::ref_ptr<osg::Geode> mygeode2 = new osg::Geode;
osg::StateSet* mystate0 = root->getOrCreateStateSet();
osg::StateSet* mystate1 = mypat1->getOrCreateStateSet();
osg::Image* image = new osg::Image;
osg::Image::MipmapDataType mipmapData;
unsigned int s = 32;
unsigned int totalSize = 0;
unsigned i;
for(i=0; s>0; s>>=1, ++i)
{
if (i>0) mipmapData.push_back(totalSize);
totalSize += s*s*4;
}
unsigned char* ptr = new unsigned char[totalSize];
image->setImage(32, 32, 32, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, ptr,
osg::Image::USE_NEW_DELETE,1);
image->setMipmapLevels(mipmapData);
s = 32;
for(i=0; s>0; s>>=1, ++i)
{
fillSpotLightImage(ptr, osg::Vec4(1.0f,1.0f,1.0f,1.0f),
osg::Vec4(1.0f,0.1f*s,1.0f/s,1.0f), s, 1.0);
ptr += s*s*4;
}
osg::Texture2D* mytex1 = new osg::Texture2D;
mytex1->setImage( 0, image );
mytex1->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
mytex1->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
mytex1->setFilter(osg::Texture::MIN_FILTER,
osg::Texture::NEAREST_MIPMAP_NEAREST);
mytex1->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);
mystate0->setTextureAttributeAndModes( 0, mytex1,
osg::StateAttribute::ON );
mygeode1->addDrawable( createPlane(5, 5).get() );
//mygeode2->addDrawable( createPlane(5, 5).get() );
mypat1->setPosition( osg::Vec3(-10.0, 0.0, 0.0) );
mypat1->addChild( mygeode1.get() );
mypat2->addChild( mygeode2.get() );
root->addChild( mypat1.get() );
root->addChild( mypat2.get() );
viewer.setSceneData( root.get() );
return viewer.run();
}
#include "stdafx.h"
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Texture>
#include <osg/Texture2D>
#include <osg/Geometry>
#include <osg/Geode>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osg/Image>
#include <osgViewer/Viewer>
osg::ref_ptr<osg::Geometry> createPlane( float length, float width )
{
osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;
vec->resize( 4 );
(*vec)[0] = osg::Vec3f( -2, 0, -2 );
(*vec)[1] = osg::Vec3f( -2, 0, 2 );
(*vec)[2] = osg::Vec3f( 2, 0, 2 );
(*vec)[3] = osg::Vec3f( 2, 0, -2 );
osg::ref_ptr<osg::Vec3Array> nor = new osg::Vec3Array;
nor->push_back( osg::Vec3f( 0.0, -1.0, 0.0 ) );
osg::ref_ptr<osg::Vec2Array> tex = new osg::Vec2Array;
tex->push_back( osg::Vec2f(0.0, 0.0) );
tex->push_back( osg::Vec2f(0.0, 1.0) );
tex->push_back( osg::Vec2f(1.0, 1.0) );
tex->push_back( osg::Vec2f(1.0, 0.0) );
osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
geo->setVertexArray( vec.get() );
geo->setTexCoordArray( 0, tex.get() );
geo->setNormalArray( nor.get() );
geo->setNormalBinding( osg::Geometry::BIND_PER_PRIMITIVE_SET );
geo->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0,
4 ) );
return geo;
}
int main(int, char **)
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Geode> mygeode = new osg::Geode;
osg::StateSet* mystate0 = mygeode->getOrCreateStateSet();
osg::ref_ptr<osg::Image> img = osgDB::readImageFile("osg32.rgb");
osg::ref_ptr<osg::Image> img1 = osgDB::readImageFile("osg16.rgb");
osg::ref_ptr<osg::Image> image = new osg::Image;
osg::Image::MipmapDataType mipmapData;
mipmapData.push_back(img->getTotalSizeInBytes());
//mipmapData.push_back(img->getTotalSizeInBytes()+img1->getTotalSizeInBytes());
unsigned char* ptr = new unsigned
char[img->getTotalSizeInBytes()+img1->getTotalSizeInBytes()];
image->setImage(img->s(), img->t(), img->r(),
img->getInternalTextureFormat(), img->getPixelFormat(),
img->getDataType(),
ptr, osg::Image::USE_NEW_DELETE,img->getPacking());
image->setMipmapLevels(mipmapData);
memcpy(ptr, img->data(), img->getTotalSizeInBytes());
memcpy(ptr+img->getTotalSizeInBytes(), img1->data(),
img1->getTotalSizeInBytes());
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
osg::ref_ptr<osg::Texture2D> mytex = new osg::Texture2D;
mytex->setImage( 0, image.get() );
mytex->setUseHardwareMipMapGeneration(false);
mystate0->setTextureAttributeAndModes( 0, mytex.get(),
osg::StateAttribute::ON );
mygeode->addDrawable( createPlane(64, 64).get() );
viewer.setSceneData( mygeode.get() );
return viewer.run();
}
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org