Hi,
when using shaders (SimpleSHLChunk) with automatic variables (such as
OSGInvViewMatrix) within a ChunkOverrideGroup, the corresponding
variable is never evaluated (the evaluate function in which the uniform
should be set is not called) and remains zero. A minimal example is
attached.
Any ideas on how to solve this?
Best regards
--
Johannes S. Mueller-Roemer, MSc
Wiss. Mitarbeiter - Interactive Engineering Technologies (IET)
Fraunhofer-Institut für Graphische Datenverarbeitung IGD
Fraunhoferstr. 5 | 64283 Darmstadt | Germany
Tel +49 6151 155-606 | Fax +49 6151 155-139
[email protected] | www.igd.fraunhofer.de
#include <OpenSG/OSGGLUT.h>
#include <OpenSG/OSGConfig.h>
#include <OpenSG/OSGSimpleGeometry.h>
#include <OpenSG/OSGGLUTWindow.h>
#include <OpenSG/OSGSimpleSceneManager.h>
#include <OpenSG/OSGSimpleSHLChunk.h>
#include <OpenSG/OSGMaterialGroup.h>
#include <OpenSG/OSGChunkOverrideGroup.h>
#define STRINGIFY(A) #A
static const char *vs = STRINGIFY(
uniform mat4 OSGInvViewMatrix;
varying vec3 objPos;
void main()
{
objPos = (OSGInvViewMatrix * gl_ModelViewMatrix *
gl_Vertex).xyz;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
);
static const char *fs = STRINGIFY(
varying vec3 objPos;
void main()
{
gl_FragColor = vec4(.5*objPos+.5, 1.);
}
);
OSG::SimpleSceneManager *mgr;
int setupGLUT( int *argc, char *argv[] );
#define CHUNK_OVERRIDE
int main(int argc, char **argv)
{
OSG::osgInit(argc,argv);
int winid = setupGLUT(&argc, argv);
{
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
OSG::NodeRefPtr torus = OSG::makeTorus(.25, 1., 64, 128);
OSG::SimpleSHLChunkRefPtr shader =
OSG::SimpleSHLChunk::create();
shader->setVertexProgram(vs);
shader->setFragmentProgram(fs);
shader->addOSGVariable("OSGInvViewMatrix");
OSG::ChunkMaterialRefPtr material =
OSG::ChunkMaterial::create();
material->addChunk(shader);
OSG::MaterialGroupRefPtr mg = OSG::MaterialGroup::create();
mg->setMaterial(material);
OSG::NodeRefPtr mgNode = OSG::makeNodeFor(mg);
mgNode->addChild(torus);
#ifdef CHUNK_OVERRIDE
OSG::SimpleSHLChunkRefPtr overrideShader =
OSG::SimpleSHLChunk::create();
overrideShader->setVertexProgram(vs);
overrideShader->setFragmentProgram(fs);
overrideShader->addOSGVariable("OSGInvViewMatrix");
OSG::ChunkOverrideGroupRefPtr overrideChunk =
OSG::ChunkOverrideGroup::create();
overrideChunk->addChunk(overrideShader);
OSG::NodeRefPtr overrideNode = OSG::makeNodeFor(overrideChunk);
overrideNode->addChild(mgNode);
#endif
OSG::commitChanges();
mgr = new OSG::SimpleSceneManager;
mgr->setWindow(gwin);
#ifndef CHUNK_OVERRIDE
mgr->setRoot(mgNode);
#else
mgr->setRoot(overrideNode);
#endif
mgr->showAll();
}
glutMainLoop();
return 0;
}
void display(void)
{
mgr->redraw();
}
void reshape(int w, int h)
{
mgr->resize(w, h);
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
if(button > 2)
return;
if(state)
mgr->mouseButtonRelease(button, x, y);
else
mgr->mouseButtonPress(button, x, y);
glutPostRedisplay();
}
void motion(int x, int y)
{
mgr->mouseMove(x, y);
glutPostRedisplay();
}
void keyboard(unsigned char k, int x, int y)
{
switch(k)
{
case 27:
{
delete mgr;
OSG::osgExit();
exit(0);
}
break;
case 's':
{
mgr->setStatistics(!mgr->getStatistics());
}
break;
}
}
int setupGLUT(int *argc, char *argv[])
{
glutInit(argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
int winid = glutCreateWindow("OpenSG");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
return winid;
}
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users