Hi,

On Thu, 2010-03-18 at 11:09 +0100, Andreas Halm wrote:
> Hi,
> 
> > What exactly is "the state switch" you are referring to, i.e. what state
> is > being switched from what to what?
> 
> The scene consists only of about 20 items, all of them are using the same
> ChunkMaterial:
> 
> Class Residue :public ResidueBase {
> 
> [...]
> 
>       static void initialize(int w, int h);
>       static void terminate();
>       static void updateViewportSize(int w, int h);
> 
>       static ShaderProgramUnrecPtr         m_pSpacefillVP;
>       static ShaderProgramUnrecPtr         m_pSpacefillFP;
>       static ChunkMaterialUnrecPtr         m_pSpacefillMaterial;
>       static Vec4f                         m_Viewport;
> 
>       Action::ResultE draw(DrawEnv*);
> 
> }
> 
> The viewport variable and update routine are in there as the viewport
> dimension is a uniform variable in the shader, and this way I can update it
> only when the window size changes.
> 
> What happens is that the shader gets activated and deactivated for every one
> of the 20 items, although I would have thought OpenSG would be smart enough
> to see that both materials are identical - but that can only work when the
> generated states are identical, and from a first look it seems they are not.

I'm looking into it, looks like there might be a wrong default setup for
the state sorter.

> 
> > no, the finalize only retrieves what is already there, if it creates
> > something it should be cached (but nothing in there yet does this yet).
> 
> Ok this means i should also keep a static state variable and call finalize
> only the first time?

no, for your case it should not really matter, for a simple Material as
ChunkMaterial finalize will just do a 'return this'; The state itself
should be internally cached so no need to do this again.

> > a) which chunks are set for the generated state ?
> 
> There are no other chunks, only the shader. The code is identical to
> carstens, that's why I didn't post it.
> As a reference, this is the setup code:
> 
> void Residue::initialize(int w, int h)
> {
>       m_Viewport.setValues(0,0,w,h);
> 
>       ShaderProgramChunkUnrecPtr shader = ShaderProgramChunk::create();
>       m_pSpacefillVP = OSG::ShaderProgram::createVertexShader();
>       m_pSpacefillVP->readProgram(filename1);
>       shader->addShader(m_pSpacefillVP);
> 
>       m_pSpacefillFP = OSG::ShaderProgram::createFragmentShader();
>       m_pSpacefillFP->readProgram(filename2);
>       shader->addShader(m_pSpacefillFP);
> 
>       m_pSpacefillVP->addUniformVariable("viewport",m_Viewport);
> 
>       m_pSpacefillMaterial = ChunkMaterial::create();
>       m_pSpacefillMaterial->addChunk(shader);
> }

ok.

> > b) are there overrides except for lights ?
> 
> There is no StateOverride if you mean that, I do change OpenGL state but
> encapsulated by glPushAttrib/glPopAttrib.
> I just started converting a pure OpenGL drawing routine to use the OpenSG
> shader stuff, doing one step at a time, and have not looked at the
> StateOverride stuff yet.

ok.

> > c) are these duplicated state switches for elements with the
> >    same material (same object) or different material which just share
> >    some chunks ?
> 
> As mentioned above, all the objects in the scene use the same material, but
> it is switched every time. That's why I get the error message like 20 times
> per frame not only once.
> 

ok, I'm about to track down why the state sorter doesn't sort as
expected.

For the error message could you just break into the
ShaderProgramChunk::deactivate and send me the callstack,
your OSGConfigured.h looks ok. As you only get the warning
for deactivate something is really strange.

kind regards
  gerrit



------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Opensg-users mailing list
Opensg-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to