Отключить текстурирование в OpenSceneGraph - PullRequest
0 голосов
/ 27 февраля 2009

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

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

Ответы [ 4 ]

1 голос
/ 12 ноября 2011

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

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

1 голос
/ 01 мая 2009

Удалось ли установить бит 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 будет игнорироваться, но вы можете оказаться в положении, когда вы знаете, что этого не произойдет.

0 голосов
/ 14 июня 2011

Используете ли вы 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 () )

0 голосов
/ 14 марта 2009

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

...