Отключить текстурирование в OpenSceneGraph

Мне нужно полностью отключить текстурирование в OSG. Я попробовал glDisable(GL_TEXTURE_2D), а также использовал osg::stateSet, но некоторые узлы с текстурами все еще отображают свои текстуры. Есть ли способ глобально отключить текстурирование?

Немного предыстории: мне нужно создать карту покрытия объектов для сцены, то есть зная, какой объект произвел каждый видимый пиксель. Я визуализирую каждый объект с однородным цветом и считываю цветовой буфер — вот почему текстурирование ломает то, что я пытаюсь сделать. Любые другие идеи о том, как это сделать?


person ggambett    schedule 27.02.2009    source источник


Ответы (4)


Установили ли вы бит osg::StateAttribute::OVERRIDE при установке атрибута Texture2D? то есть что-то вроде

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

где ss — это набор состояний на узле, расположенном достаточно высоко в вашем графе сцены, чтобы охватить все, что может иметь текстуры.

Конечно, если в режиме GL_TEXTURE_2D или любых атрибутах Texture2D ниже установлен бит osg::StateAttribute::PROTECTED, тогда OVERRIDE будет проигнорирован, но вы можете быть в положении, когда вы знаете, что этого не произойдет.

person Troubadour    schedule 30.04.2009

Причина, по которой у вас возникли проблемы, вероятно, заключается в том, что некоторые узлы используют osg::StateAttribute::OVERRIDE, как и предложил Troubadour (справедливо). Предполагая, что это так, вы можете создать посетителя узла, который фактически обходит все дерево и отключает рендеринг текстуры - очень грубо, но будет работать.

Что касается второй части вашего вопроса: Один из вариантов - использовать уже встроенные в OSG функции для пересечений - бросить луч от глаза к каждому пикселю на экране, и посмотреть, где он пересекается - ОЧЕНЬ медленно, но будет работать для конечно :) Есть также режим выбора openGL (хотя я должен сказать, что никогда не использовал его сам, поэтому я не знаю, насколько он сложен в использовании) - вы можете прочитать об этом здесь: http://www.opengl.org/resources/faq/technical/selection.htm

person Ido.Schwartzman    schedule 11.11.2011

Рассматривали ли вы возможность опубликовать свой вопрос в списке рассылки OSG? Казалось бы, куда более подходящее место для вопроса.

person none    schedule 14.03.2009

Используете ли вы osgViewer::Viewer (одиночное средство просмотра по умолчанию) или osgViewer::View? Клавиша 't' переключает текстурирование в тех случаях, если osgGA::StateSetManipulator был добавлен с помощью addEventHandler().

В итоге вызывается 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* — верхний узел (например, корневой узел, установленный в Viewer/View->setSceneData())

person ginbot    schedule 14.06.2011