查看: 1766|回复: 16

求助:如何将场景中的其它Node设置成透明的?

[复制链接]

该用户从未签到

发表于 2014-6-19 15:19:58 | 显示全部楼层 |阅读模式
本帖最后由 xueyu200 于 2014-6-19 15:51 编辑

在场景中,如何将所有未选中的物体,设置成透明的呢?
难道只能改变每个物体的StateSet吗?
有其它的好方法吗?
QQ截图20140619155059.png

该用户从未签到

发表于 2014-6-20 15:47:22 | 显示全部楼层
隐藏节点用setNodemask(0x0),改变节点的拣选掩码,一句话多简单啊
switch节点,我常常使用它进行不同节点之间的切换

该用户从未签到

 楼主| 发表于 2014-6-20 10:51:24 | 显示全部楼层

能更具体一些吗? 对这个实在是不在行!

该用户从未签到

发表于 2014-6-20 11:18:20 | 显示全部楼层
shader也都是通过stateset启动改变,透明就是opengl的一个状态,这个应该没有别的方法吧,另外效果不错

该用户从未签到

 楼主| 发表于 2014-6-20 11:20:51 | 显示全部楼层
casthc 发表于 2014-6-20 11:18
shader也都是通过stateset启动改变,透明就是opengl的一个状态,这个应该没有别的方法吧,另外效果不错

我还想着有更好的办法呢,谢谢啦

该用户从未签到

发表于 2014-6-20 11:22:57 | 显示全部楼层
是不是你觉得需要为每一个节点设置透明的操作觉得很重复繁琐?

该用户从未签到

 楼主| 发表于 2014-6-20 11:26:26 | 显示全部楼层
casthc 发表于 2014-6-20 11:22
是不是你觉得需要为每一个节点设置透明的操作觉得很重复繁琐?

是的,我想着是不是能给Root设置一个总的stateset, 然后给具体的node设置一个不一样的stateset,但是好像不是很成功!

该用户从未签到

 楼主| 发表于 2014-6-20 11:29:30 | 显示全部楼层
xueyu200 发表于 2014-6-20 11:26
是的,我想着是不是能给Root设置一个总的stateset, 然后给具体的node设置一个不一样的stateset,但是好像 ...

设置透明还好一些,好像能行,但是如果加上
  1. unsigned int textureMode = osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF;
  2.         for( unsigned int ii=0; ii<4; ii++ )
  3.         {
  4.                 m_spUnSelectStateset->setTextureMode( ii, GL_TEXTURE_1D, textureMode );
  5.                 m_spUnSelectStateset->setTextureMode( ii, GL_TEXTURE_2D, textureMode );
  6.                 m_spUnSelectStateset->setTextureMode( ii, GL_TEXTURE_3D, textureMode );
  7.                 m_spUnSelectStateset->setTextureMode( ii, GL_TEXTURE_CUBE_MAP, textureMode);
  8.         }
复制代码
,在子节点再开启它,但是还是不能显示贴图

该用户从未签到

发表于 2014-6-20 11:34:56 | 显示全部楼层
呵呵 看来我猜对了~~ 你应该使用Root设置一个总的stateset但是要使用unsigned int textureMode = osg::StateAttribute:ROJECT|osg::StateAttribute::ON;来启动透明,然后不需要设置透明的子节点设置为OFF

该用户从未签到

发表于 2014-6-20 11:35:55 | 显示全部楼层
当然我说的只是透明,没涉及贴图这个问题

该用户从未签到

 楼主| 发表于 2014-6-20 11:37:02 | 显示全部楼层
casthc 发表于 2014-6-20 11:34
呵呵 看来我猜对了~~ 你应该使用Root设置一个总的stateset但是要使用unsigned int textureMode = osg::Stat ...

不显示纹理贴图,使用这种思路就不行呀,哎,不知道为什么

该用户从未签到

发表于 2014-6-20 11:40:39 | 显示全部楼层
你使用OVERRIDE会覆盖掉子节点的纹理

该用户从未签到

 楼主| 发表于 2014-6-20 12:00:17 | 显示全部楼层
casthc 发表于 2014-6-20 11:40
你使用OVERRIDE会覆盖掉子节点的纹理

哦,那么使用PROTECTED?还是INHERIT呀?

该用户从未签到

发表于 2014-6-20 13:13:06 | 显示全部楼层
本帖最后由 casthc 于 2014-6-20 13:14 编辑

是的 PROTECTED,我上面做过回答了

该用户从未签到

 楼主| 发表于 2014-6-20 14:28:17 | 显示全部楼层
casthc 发表于 2014-6-20 13:13
是的 PROTECTED,我上面做过回答了


还有一个问题,如何隐藏未选中的节点呢?有好办法吗?
我现在是使用setNodeMask来控制的……
osg::Switch感觉有点不符合,不能直接拿来就用

该用户从未签到

发表于 2014-6-26 21:19:51 | 显示全部楼层
用vector配合switch,来个for循环,很容易就把其他的隐藏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表