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.
> 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?
> 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);
}
> 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.
> 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.
Aloha, Andi
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users