查看: 3573|回复: 18

关于文字透明显示的问题(7楼已放出可执行程序)

[复制链接]

该用户从未签到

发表于 2008-9-12 17:08:57 | 显示全部楼层 |阅读模式
我把圆锥体设为了透明了,为什么下面的圆柱体和纹理贴图都能显示,但就是中间的文字显示不了呢?

[ 本帖最后由 Sailent 于 2008-9-17 18:07 编辑 ]
untitled.JPG

该用户从未签到

发表于 2008-9-12 17:31:12 | 显示全部楼层
不是很清楚,好像osgText的库的实现和显卡之类都有些关系。
您可以尝试用setRenderBinDetails设置一下渲染的顺序,看看有没有效果。比如对于透明圆锥的StateSet,让它在最后渲染:
stateSet->setRenderingHint( TRANSPARENT_BIN );

该用户从未签到

 楼主| 发表于 2008-9-12 17:45:10 | 显示全部楼层
谢谢啦,的确和渲染顺序有关,问题解决了~

该用户从未签到

 楼主| 发表于 2008-9-17 12:29:31 | 显示全部楼层
有新问题:为什么从这个角度看,下面的4个0会显示出来,上面的5个0显示不出来呢?
附件中有可执行程序。
temp3.JPG

test1.rar

187.27 KB, 下载次数: 149, 下载积分: 威望 1

该用户从未签到

发表于 2008-9-17 12:39:46 | 显示全部楼层
HUD显示试试~~~~

该用户从未签到

 楼主| 发表于 2008-9-17 14:24:02 | 显示全部楼层

回复 5楼 的帖子

HUD是把字放在照相机上吧?我只是想把字能透过那个玻璃罩显示啊~

该用户从未签到

 楼主| 发表于 2008-9-17 18:06:15 | 显示全部楼层
发现就是文字的问题,那根指针都能正常显示。该怎么办呢?不会要我用Geometry类去画数字吧?

test1.rar

187.67 KB, 下载次数: 116, 下载积分: 威望 1

该用户从未签到

发表于 2008-9-17 21:52:37 | 显示全部楼层
这个我也不知道了,,HUD应该可以解决你的问题~~~~~

该用户从未签到

发表于 2008-9-17 22:41:51 | 显示全部楼层
没有您的代码作参考,抱歉我也不太清楚其中的原因了。也许还是渲染顺序的原因吧,不知您是否把文字和透明表盘的渲染顺序都滞后了

该用户从未签到

 楼主| 发表于 2008-9-18 09:36:47 | 显示全部楼层
谢谢了,问题已经解决了,加上这句就可以了:stateSet->setRenderingHint( OPAQUE_BIN);作用是设置字体为不透明(TRANSPARENT_BIN 是设置为透明,DEFAULT_BIN是默认),而不是渲染顺序。
虽然问题已经解决了,不过还是不清楚没加的时候为什么会有那个问题呢?

该用户从未签到

发表于 2008-9-18 09:55:44 | 显示全部楼层
原帖由 Sailent 于 2008-9-18 09:36 发表
谢谢了,问题已经解决了,加上这句就可以了:stateSet->setRenderingHint( OPAQUE_BIN);作用是设置字体为不透明(TRANSPARENT_BIN 是设置为透明,DEFAULT_BIN是默认),而不是渲染顺序。
虽然问题已经解决了,不过还 ...


正是渲染顺序的问题~~

setRenderingHint实质上等同于设置渲染顺序,DEFAULT_BIN表示顺序号0,不新增渲染元,OPAQUE_BIN表示顺序号0,新增普通渲染元;TRANSPARENT_BIN表示顺序号10,新增“深度排序”渲染元。
参看《最长的一帧》

该用户从未签到

 楼主| 发表于 2008-9-18 10:24:55 | 显示全部楼层
我看到stateset头文件(OSG2.4)里面的定义是这样的:
        enum RenderingHint
        {
            DEFAULT_BIN = 0,
            OPAQUE_BIN = 1,
            TRANSPARENT_BIN = 2
        };

        /** Set the \c RenderingHint of this \c StateSet. \c RenderingHint is
          * used by the renderer to determine which draw bin to drop associated
          * <tt>osg:rawable</tt>s in. Typically, users will set this to either
          * \c StateSet::OPAQUE_BIN or \c StateSet::TRANSPARENT_BIN.
          * <tt>Drawable</tt>s in the opaque bin are sorted by their
          * \c StateSet, so that the number of expensive changes in the OpenGL
          * state is minimized. <tt>Drawable</tt>s in the transparent bin are
          * sorted by depth, so that objects farther from the viewer are
          * rendered first (and hence alpha blending works nicely for
          * translucent objects).
        */
看这段英文的意思应该是说实际上把节点放在不同的排列顺序里。

该用户从未签到

发表于 2008-9-18 11:07:05 | 显示全部楼层
事实上是把状态树中的StateSet放置到渲染树中不同的RenderBin里面。渲染后台中实际上已经跟场景节点没什么关系了,主要是对StateSet和Drawable的处理。
可以看《最长的一帧》,里面有解释也有示意图~~(拼命打广告

也可以看StateSet::setRenderingHint的代码实现:
  1. case(TRANSPARENT_BIN):
  2. {
  3.      _binMode = USE_RENDERBIN_DETAILS;
  4.      _binNum = 10;
  5.      _binName = "DepthSortedBin";
  6.      break;
  7. }
  8. case(OPAQUE_BIN):
  9. {
  10.      _binMode = USE_RENDERBIN_DETAILS;
  11.      _binNum = 0;
  12.      _binName = "RenderBin";
  13.      break;
  14. }
复制代码

该用户从未签到

 楼主| 发表于 2008-9-19 10:07:12 | 显示全部楼层

加上影子之后文字又显示不出来了

为了增加真实感,我给程序加了影子效果,但是加上之后数字又显示不出来了。
  1.         osg::ref_ptr<osgShadow::ShadowedScene> shadowedScene = new osgShadow::ShadowedScene;

  2.         shadowedScene->setReceivesShadowTraversalMask(1);
  3.         shadowedScene->setCastsShadowTraversalMask(2);

  4.         osg::ref_ptr<osgShadow::ShadowMap> sm = new osgShadow::ShadowMap;
  5.         shadowedScene->setShadowTechnique(sm.get());
  6.         shadowedScene->addChild(root.get());
  7. //        shadowedScene->getOrCreateStateSet()->setRenderingHint( osg::StateSet::TRANSPARENT_BIN);
  8.         viewer.setSceneData(shadowedScene.get());

  9. //        viewer.setSceneData(root.get());
复制代码
test1是没加影子的,test2是加了影子效果的。对比可以看出,红色指针和固定指针的那个黑色的小圆盘都能正常显示,偏偏文字显示不了,是怎么回事呢?我文字用的是osgText::Text类生成的。另外,FlySky大哥一直建议我用HUD,我研究了一下osghud那个例子,好像HUD文字只是把文字贴在照相机上吧?而我想做的是把文字贴在实体上啊。

[ 本帖最后由 Sailent 于 2008-9-19 10:09 编辑 ]

test2.rar

189.92 KB, 下载次数: 124, 下载积分: 威望 1

加了影子效果的

test1.rar

189.64 KB, 下载次数: 110, 下载积分: 威望 1

没有影子效果的

该用户从未签到

发表于 2008-9-19 10:22:30 | 显示全部楼层
要把文字加在实体上的话,最好用纹理烘焙(RTT),又省事又安全。不过如果您的显卡配置比较低就算了~~
参考osgprerender,或者我的教程~~

该用户从未签到

 楼主| 发表于 2008-9-19 17:14:18 | 显示全部楼层

osgText的问题好多啊

osgText的问题好多啊,在自己电脑上能正常运行,到配置更好的机器上运行居然会莫名其妙的crash掉,该怎么办啊……

该用户从未签到

发表于 2008-9-19 17:22:50 | 显示全部楼层
原帖由 Sailent 于 2008-9-19 17:14 发表
osgText的问题好多啊,在自己电脑上能正常运行,到配置更好的机器上运行居然会莫名其妙的crash掉,该怎么办啊……


看看你的程序中有没有实时更新Text对象的情况,设置那些需要实时改动的对象为DYNAMIC,以免渲染过程与用户更新过程冲突。编程是不存在莫名其妙的事情的~~

另一种不推荐的方法是换而使用SingleThreaded模式,这样估计不会有错了,但是也完全放弃了OSG强大的多线程渲染能力

该用户从未签到

 楼主| 发表于 2008-9-19 17:44:24 | 显示全部楼层
果然加上text->setDataVariance(osg::Object:YNAMIC);就没问题了,万分感谢啊~~~~
不过为什么在我电脑上运行的时候一点问题都没有呢?我电脑的配置是512M内存,出问题的电脑是2G内存的,CPU也比我的电脑高一个档次。我更新文字的办法是在CallBack里面不停的调用text->setText()。

该用户从未签到

发表于 2008-9-19 18:16:05 | 显示全部楼层
原帖由 Sailent 于 2008-9-19 17:44 发表
果然加上text-&gt;setDataVariance(osg::Object:YNAMIC);就没问题了,万分感谢啊~~~~
不过为什么在我电脑上运行的时候一点问题都没有呢?我电脑的配置是512M内存,出问题的电脑是2G内存的,CPU也比我的电脑高一个档次 ...


关键不是内存,而是显卡和CPU,还有对OpenGL版本的支持程度。
可能您的显卡配置比较低一些。所以自动选择了单线程模式或者CullDrawThreadPerContext模式,这两种模式中用户更新操作不会和渲染过程冲突。
稍高配置的机器,比如俺的Core Quad+9600GT,肯定会自动选择CullThreadPerCameraDrawThreadPerContext模式的,渲染效率提高,亦有并行处理的能力,不过编程不小心往往会造成崩溃。算是双刃剑吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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