Hi,
I'm facing a little problem with OSG on Android : I use an ortho2D camera to
display simple quads, but they are displayed in the wrong order.
Simple example : I try to display a green square in front of a green square, so
I add the red square first in my graph, and then my green square.
On my PC, with OSG built with openGl es 2 compatibility it works, but on my
android phone, the red square is displayed in front of the green square.
Any idea ?
Here is a sample code.
static const char vertSource[] =
"attribute vec4 osg_Vertex;
\n"
"attribute vec4 osg_Color;
\n"
"attribute vec4 osg_MultiTexCoord0;
\n"
"uniform mat4 osg_ModelViewProjectionMatrix;
\n"
"varying vec4 v_col;
\n"
"
\n"
"void main(void)
\n"
"{
\n"
" gl_Position = osg_ModelViewProjectionMatrix * osg_Vertex;
\n"
" v_col = osg_Color;
\n"
"}
\n"
"
\n";
static const char fragSource[] =
"precision mediump float;
\n"
"varying vec4 v_col;
\n"
"void main(void)
\n"
"{
\n"
" gl_FragColor = v_col;
\n"
" gl_FragColor.a = 0.5;
\n"
"}
\n"
"
\n";
osg::Geode* createQuad(const osg::Vec2 &size, const osg::Vec4 &color)
{
osg::Geode *geode = new osg::Geode();
osg::Geometry *geometry = new osg::Geometry();
osg::Vec3Array* vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(0, 0, 0));
vertices->push_back(osg::Vec3(0, 0, size.y()));
vertices->push_back(osg::Vec3(size.x(), 0, size.y()));
vertices->push_back(osg::Vec3(size.x(), 0, 0));
geometry->setVertexArray(vertices);
osg::Vec4Array* colors = new osg::Vec4Array;
colors->push_back(color);
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
geometry->addPrimitiveSet(new
osg::DrawArrays(osg::PrimitiveSet::QUADS,0,vertices->size()));
osg::Program* program = new osg::Program();
osg::Shader* frag = new osg::Shader(osg::Shader::FRAGMENT, fragSource);
osg::Shader* vert = new osg::Shader(osg::Shader::VERTEX, vertSource);
program->addShader(vert);
program->addShader(frag);
geode->getOrCreateStateSet()->setAttribute(program);
geode->addDrawable(geometry);
return geode;
}
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
viewer->setCameraManipulator(new osgGA::TrackballManipulator());
#ifdef ANDROID
viewer->setUpViewerAsEmbeddedInWindow(0,0, 800, 600);
viewer->realize();
#else
viewer->setUpViewInWindow(40,40,800, 600);
#endif
viewer->getCamera()->getOrCreateStateSet()->setMode(GL_LIGHTING,
osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE |
osg::StateAttribute::PROTECTED);
viewer->getCamera()->getOrCreateStateSet()->setMode(GL_DEPTH_TEST,
osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE |
osg::StateAttribute::PROTECTED);
viewer->getCamera()->setProjectionMatrixAsOrtho2D(-400, 400, -300,
300);
osg::Group *root = new osg::Group();
// Add a "horizontal" red rectangle - should be "behind"
root->addChild(createQuad(osg::Vec2(200,100), osg::Vec4(1,0,0,1)));
// Add a "vertical" green rectangle - should be "in front"
root->addChild(createQuad(osg::Vec2(100,200), osg::Vec4(0,1,0,1)));
viewer->setSceneData(root);
// And then run the viewer...
}
Thanks a lot !
Cheers,
Bruno
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=54926#54926
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org