2009-02-27 11 views
0

Je dois désactiver complètement la texturation dans OSG. J'ai essayé glDisable(GL_TEXTURE_2D) et aussi en utilisant un osg :: stateSet, mais certains nœuds qui ont des textures restituent leurs textures. Est-il possible de désactiver la texturation à l'échelle mondiale? Un peu d'arrière-plan: J'ai besoin de produire une carte de couverture d'objet pour une scène, c'est-à-dire de savoir quel objet a produit chaque pixel visible. Je rends chaque objet avec une couleur plate et relis le tampon de couleur - c'est pourquoi la texturation brise ce que j'essaie de faire. D'autres idées sur la façon d'accomplir cela?Désactiver la texturation dans OpenSceneGraph

Répondre

0

Avez-vous envisagé de publier votre question sur la liste de diffusion OSG? Cela semblerait être un endroit beaucoup plus approprié à demander.

1

Avez-vous veillé à définir le bit osg :: StateAttribute :: OVERRIDE lors de la définition de l'attribut Texture2D? à-dire quelque chose comme

osg::Texture2D*const tex2D = new osg::Texture2D; 
ss->setAttributeAndModes(tex2D, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE); 

ss est un StateSet sur un nœud assez haut dans votre scène graphique pour englober toutes les choses qui pourraient avoir des textures.

Bien sûr, si le mode GL_TEXTURE_2D ou les attributs Texture2D plus bas ont le bit osg :: StateAttribute :: PROTECTED défini, alors le OVERRIDE sera ignoré mais vous pourriez être dans une position où vous savez que cela n'arrivera pas.

0

Utilisez-vous osgViewer :: Viewer (l'afficheur simple/par défaut) ou un osgViewer :: View? La touche 't' permet d'activer la texturation dans ceux-ci si osgGA :: StateSetManipulator a été ajouté avec addEventHandler().

Finalement, ce qui est appelé est void StateSetManipulator :: setTextureEnabled (bool newtexture). Ce qu'il fait est:

unsigned int mode = osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF; 
for(unsigned int ii=0; ii < 4; ii++) 
{ 
    _stateset->setTextureMode(ii, GL_TEXTURE_1D, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_2D, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_3D, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_RECTANGLE, mode); 
    _stateset->setTextureMode(ii, GL_TEXTURE_CUBE_MAP, mode); 
} 

Où * _stateset * est un nœud haut (par exemple, le nœud racine fixé à Viewer/Affichage-> setSceneData())

1

La raison pour laquelle vous avez des problèmes est probablement que certains nœuds utilisent osg :: StateAttribute :: OVERRIDE, comme Troubadour (à juste titre) vous suggère de le faire. En supposant que c'est le cas, vous pouvez créer un visiteur de nœud qui traverse réellement l'arbre entier et arrête le rendu de texture - très brut, mais cela fonctionnera. En ce qui concerne la deuxième partie de votre question: Une option consiste à utiliser les fonctions déjà intégrées dans OSG pour les intersections - jeter un rayon de l'œil à chaque pixel de l'écran, et voir où il se croise - TRÈS lent, mais il travaillera à coup sûr :) Il y a aussi le mode de sélection openGL (bien que je doive dire que je ne l'ai jamais utilisé moi-même, donc je ne sais pas à quel point il est compliqué) - vous pouvez lire ici ici: http://www.opengl.org/resources/faq/technical/selection.htm