2009-02-27 11 views
0

'daki tekstüre işlemini devre dışı bırak OSG'deki tekstüre işlemini tamamen kapatmalıyım. glDisable(GL_TEXTURE_2D)'u ve ayrıca bir osg :: stateSet kullanmayı denedim, ancak dokuları olan bazı düğümler hala dokularını oluşturuyor. Dünyayı tekstüre etmenin bir yolu var mı?OpenSceneGraph

Biraz arka plan: Bir sahne için bir nesne kapsama haritası oluşturmam gerekiyor, yani her bir görünen pikselin hangi nesneyi ürettiğini bilmem gerekiyor. Her bir nesneyi düz bir renkle işledim ve renk arabelleğini geri okuyordum - bu yüzden tekstüre yapmaya çalıştığım şey kırılıyor. Bunu nasıl başaracağınıza dair başka bir fikir var mı?

cevap

0

Sorunuzu OSG posta listesine göndermeyi düşündünüz mü? Bu sormak için çok daha uygun bir yer gibi görünüyor.

1

Texture2D özniteliğini ayarlarken osg :: StateAttribute :: OVERRIDE bitini ayarladığınızdan emin misiniz? ss dokular olabilir her şeyi kapsayacak şekilde sahne grafiğindeki kadar yeterince yüksek bir düğümde bir stateset olduğunu

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

gibi yani bir şey.

Tabii ki GL_TEXTURE_2D modu veya herhangi bir Texture2D özniteliğinin aşağıya inmesi durumunda osg :: StateAttribute :: PROTECTED biti ayarlanmışsa, OVERRIDE göz ardı edilecektir, ancak gerçekleşmeyeceğini bildiğiniz bir konumda olabilirsiniz.

0

OsgViewer :: Viewer (tek/varsayılan görüntüleyici) veya osgViewer :: View kullanıyor musunuz? 'T' tuşu, osgGA :: StateSetManipulator eklentisi addEventHandler() ile eklendiyse, dokuları değiştirir.

Sonunda, void StateSetManipulator :: setTextureEnabled (bool newtexture) olarak adlandırılan şey çağrılır. Ne yapar:

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); 
} 

Nerede * _stateset * bir yukarı yüksek düğüm (kök düğümü Görüntüleyici ayarlanmış örn/Görünüm-> setSceneData())

1

sorun yaşıyorsunuz nedeni Muhtemelen bazı düğümlerin kullanması gereken osg :: StateAttribute :: OVERRIDE (Troubadour gibi). Durum böyleyse, aslında tüm ağacın içinden geçen ve doku oluşumunu kapatan bir düğüm ziyaretçisi oluşturabilirsin - çok kaba, ama işe yarayacak.

Sorunuzun ikinci kısmına gelince: Bir seçenek, OSG'de kesişen işlevlerin zaten kullanılan kesişim noktalarını kullanmaktır - gözdeki ışınları ekranda her bir piksele yönlendirmek ve kesiştiği yeri görmek - ÇOK yavaş, ama emin çalışacağım :) Ayrıca, openGL seçme modu da var (her ne kadar bunu kendim hiç kullanmadığımı söylemek zorundayım, bu yüzden ne kadar karmaşık olduğunu bilmiyorum) - bu konuda okuyabilirsiniz : http://www.opengl.org/resources/faq/technical/selection.htm