我需要在OSG中完全禁用纹理。我尝试了glDisable(GL_TEXTURE_2D)
并使用了osg :: stateSet,但是一些具有纹理的节点仍然会渲染它们的纹理。有没有办法全局关闭纹理?
一些背景知识:我需要为场景生成一个对象覆盖图,即知道每个可见像素产生的对象。我正在渲染每个具有平面颜色的对象并回读颜色缓冲区 - 这就是为什么纹理会破坏我正在尝试做的事情。关于如何实现这一目标的任何其他想法?
答案 0 :(得分:1)
在设置Texture2D属性时,您确定设置了osg :: StateAttribute :: OVERRIDE位吗?即
之类的东西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将被忽略,但您可能处于一个您知道不会发生的位置。
答案 1 :(得分:1)
你遇到问题的原因可能是某些节点使用osg :: StateAttribute :: OVERRIDE,就像Troubadour(正确地)建议的那样。假设是这种情况,您可以创建一个实际遍历整个树并关闭纹理渲染的节点访问者 - 非常粗糙,但可以工作。
关于问题的第二部分:一个选项是使用OSG中已经内置的函数来交叉 - 将一条光线从眼睛投射到屏幕上的每个像素,并查看它相交的位置 - 非常慢,但是肯定会工作:) 还有openGL选择模式(虽然我不得不说我自己从未使用过它,所以我不知道它有多复杂) - 你可以阅读它 在这里:http://www.opengl.org/resources/faq/technical/selection.htm
答案 2 :(得分:0)
您是否考虑将问题发布到OSG邮件列表?这似乎是一个更合适的地方。
答案 3 :(得分: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 *是一个高位节点(例如设置在 Viewer / View-&gt; setSceneData()的根节点)