2009-02-27 55 views
0

我需要完全禁用OSG中的紋理。我嘗試了glDisable(GL_TEXTURE_2D)並且還使用了osg :: stateSet,但是一些具有紋理的節點仍然呈現它們的紋理。有什麼辦法可以全局關閉紋理嗎?一點背景:我需要爲一個場景生成一個物體覆蓋圖,也就是知道什麼物體產生了每個可見像素。我使用平坦的顏色渲染每個對象並讀回顏色緩衝區 - 這就是爲什麼紋理破壞我想要做的事情。有關如何完成此任何其他想法?在OpenSceneGraph中禁用紋理

回答

0

您是否考慮將您的問題發佈到OSG郵件列表?這似乎是一個更合適的地方要問。

1

您是否確定在設置Texture2D屬性時設置了osg :: StateAttribute :: OVERRIDE位?即像

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

其中ss足夠高,在你的場景圖涵蓋可能有紋理萬物節點上的stateset。

當然,如果GL_TEXTURE_2D模式或任何Texture2D屬性降低了設置了osg :: StateAttribute :: PROTECTED位,那麼忽略將被忽略,但是您可能處於一個你知道不會發生的位置。

0

您使用osgViewer :: Viewer(單一/默認查看器)還是osgViewer :: View?如果已經使用addEventHandler()添加了osgGA :: StateSetManipulator,則't'鍵將在那些紋理中切換紋理。

最終,被調用的是void StateSetManipulator :: setTextureEnabled(bool newtexture)。 它所做的是:

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

其中* _stateset *是高達節點(例如根節點設置爲瀏覽器/查看 - > setSceneData()

1

您有問題的原因可能是某些節點使用osg :: StateAttribute :: OVERRIDE,就像Troubadour(正確)建議你應該。假設是這種情況,你可以創建一個實際遍歷整棵樹並關閉紋理渲染的節點訪問器 - 非常粗糙,但是會起作用。

至於你的問題的第二部分:一種選擇是使用OSG中已經內置的函數進行交點 - 從眼睛投射光線到屏幕上的每個像素,並查看它相交的位置 - 非常慢,但肯定會工作:) 還有openGL的選擇模式(雖然我不得不說我自己從來沒有用過它,所以我不知道它有多複雜) - 你可以在這裏閱讀 這裏:http://www.opengl.org/resources/faq/technical/selection.htm