查看: 2870|回复: 23

急求助!osg下怎样实现夜视和热成像?

[复制链接]

该用户从未签到

发表于 2011-7-12 12:54:36 | 显示全部楼层 |阅读模式
如题,怎样实现夜视和热成像呢?大家给提提建议啊,谢谢~

该用户从未签到

发表于 2011-7-12 13:45:30 | 显示全部楼层
使用shader比较容易实现

该用户从未签到

发表于 2011-7-12 14:45:12 | 显示全部楼层
shader + 一级post processing 即可

该用户从未签到

发表于 2011-7-12 18:10:35 | 显示全部楼层
osg邮件列表里好像有文章讨论过。另外西电的几篇OGRE的论文可以参考!

该用户从未签到

 楼主| 发表于 2011-7-12 21:46:03 | 显示全部楼层
osg邮件列表里好像有文章讨论过。另外西电的几篇OGRE的论文可以参考!
CWorld 发表于 2011-7-12 18:10



    可以把链接地址给我发下吗?谢谢啊

该用户从未签到

发表于 2011-7-12 22:47:45 | 显示全部楼层
感觉又掉坑里了,我找了2个点了,没任何收获:curse:

该用户从未签到

 楼主| 发表于 2011-7-13 06:26:53 | 显示全部楼层
当掉坑变成一种习惯的时候,我们能做的就是趴坑里等高人来救啊:Q

该用户从未签到

发表于 2011-7-13 08:18:53 | 显示全部楼层
osgXI中早就提供夜视的例子了,热成像与之原理相同,只是shader用的不一样而已

该用户从未签到

发表于 2011-7-13 09:18:29 | 显示全部楼层
回复 5# monai1987

去列表搜索:“Need help about Night Vision Effect”
论坛地址:http://forum.openscenegraph.org/ ... =7244&view=next

比较需要注意的是热成像,上面的讨论中有人说“IR requires emissive properties on your models and a shader to utilize them. “,我个人的理解是因为热成像是按照温度来显示不同的颜色,所以不能直接使用shader改变模型的颜色来实现这个效果,夜视应该就没这个问题。

该用户从未签到

发表于 2011-7-13 10:31:02 | 显示全部楼层
回复  monai1987

去列表搜索:“Need help about Night Vision Effect”
论坛地址:

比较需要注意的 ...
aya_daxiang 发表于 2011-7-13 09:18



    :loveliness: :loveliness: :loveliness: :loveliness: :loveliness: :loveliness: :loveliness: 非常感谢指教:loveliness: :loveliness: :loveliness: :loveliness: :loveliness: :loveliness: :loveliness: :loveliness: :loveliness:

该用户从未签到

 楼主| 发表于 2011-7-13 22:47:49 | 显示全部楼层
回复  monai1987

去列表搜索:“Need help about Night Vision Effect”
论坛地址:

比较需要注意的 ...
aya_daxiang 发表于 2011-7-13 09:18



哥们,你给的链接我看到了,找到了例子,但是把代码贴进去用不了啊,能给我指点指点吗?谢谢了,代码贴出来了:
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. osg::Group* root = new osg::Group;
  4. osg::Node* node = osgDB::readNodeFile("cow.osg");
  5. osgViewer::Viewer viewer;

  6. node->addCullCallback(new myNodeCallback);
  7. osg::StateSet* stateset = root->getOrCreateStateSet();
  8. osg::Shader* vertexShader = new osg::Shader( osg::Shader::VERTEX );
  9. osg::Shader* fragmentShader = new osg::Shader( osg::Shader::FRAGMENT );
  10. vertexShader->loadShaderSourceFromFile( "yeshi.vert" );
  11. fragmentShader->loadShaderSourceFromFile( "yeshi.frag" );

  12. osg::Program* program = new osg::Program;
  13. program->addShader( vertexShader );
  14. program->addShader( fragmentShader );
  15. stateset->setAttributeAndModes( program, osg::StateAttribute::ON );
  16. //input:
  17. // sceneBuffer (sampler2D): the scene buffer.
  18. // noiseTex (sampler2D): noise texture to add some artifacts to the night vision device. The noise texture comes from this free noise texture pack.
  19. // maskTex (sampler2D): binocular mask of the night vision device.
  20. // elapsedTime (float): elapsed time in seconds.
  21. // luminanceThreshold (float): allows to change the luminance threshold. Default value: 0.2
  22. // colorAmplification (float): amplification factor for pixels with low luminance. Default value: 4.0
  23. // effectCoverage (float): effect screen coverage – only for demo needs! Default value: 0.5 (half screen)

  24. osg::Uniform* param4 = new osg::Uniform( "elapsedTime", 0 );
  25. stateset->addUniform( param4 );

  26. osg::Uniform* param5 = new osg::Uniform( "luminanceThreshold", 0.4f );
  27. stateset->addUniform( param5 );

  28. osg::Uniform* param6 = new osg::Uniform( "colorAmplification", 4.0f );
  29. stateset->addUniform( param6 );

  30. osg::Uniform* param7 = new osg::Uniform( "effectCoverage", 0.50f );
  31. stateset->addUniform( param7 );

  32. osg::Uniform* param8 = new osg::Uniform( "sceneBuffer", 0 );
  33. stateset->addUniform( param8 );
  34. osg::Uniform* param9 = new osg::Uniform( "noiseTex", 0 );
  35. stateset->addUniform( param9 );
  36. osg::Uniform* param10 = new osg::Uniform( "maskTex", 0 );
  37. stateset->addUniform( param10 );


  38. root->addChild(node);
  39. viewer.setSceneData(root);
  40. viewer.run();

  41. return 0;
  42. }
复制代码

*.frag代码如下:
  1. uniform sampler2D sceneBuffer;
  2. uniform sampler2D noiseTex;
  3. uniform sampler2D maskTex;
  4. uniform float elapsedTime; // seconds
  5. uniform float luminanceThreshold; // 0.2
  6. uniform float colorAmplification; // 4.0
  7. uniform float effectCoverage; // 0.5
  8. void main ()
  9. {
  10. vec4 finalColor;
  11. // Set effectCoverage to 1.0 for normal use.
  12. if (gl_TexCoord[0].x < effectCoverage)
  13. {
  14. vec2 uv;
  15. uv.x = 0.4*sin(elapsedTime*50.0);
  16. uv.y = 0.4*cos(elapsedTime*50.0);
  17. float m = texture2D(maskTex, gl_TexCoord[0].st).r;
  18. vec3 n = texture2D(noiseTex,
  19. (gl_TexCoord[0].st*3.5) + uv).rgb;
  20. vec3 c = texture2D(sceneBuffer, gl_TexCoord[0].st
  21. + (n.xy*0.005)).rgb;
  22. // float lum = dot(vec3(0.30, 0.59, 0.11), c);
  23. float lum = dot(vec3(0.01, 0.01, 0.01), c);
  24. if (lum < luminanceThreshold)
  25. c *= colorAmplification;

  26. vec3 visionColor = vec3(0.1, 0.95, 0.2);
  27. finalColor.rgb = (c + (n*0.2)) * visionColor * m;
  28. }
  29. else
  30. {
  31. finalColor = texture2D(sceneBuffer,
  32. gl_TexCoord[0].st);
  33. }
  34. gl_FragColor.rgb = finalColor.rgb;
  35. gl_FragColor.a = 1.0;
  36. }
复制代码

*.vert代码如下:
  1. void main()
  2. {
  3. gl_Position = ftransform();
  4. gl_TexCoord[0] = gl_MultiTexCoord0;
  5. }
复制代码


这样做之后,出来的效果是,奶牛的纹理颜色全没了,是我的那几个参数没用对吗?

该用户从未签到

 楼主| 发表于 2011-7-13 22:48:59 | 显示全部楼层
回复 8# array


    老大,能给个osgxi工程吗?我在网上没找到啊。。。谢谢了

该用户从未签到

发表于 2011-7-14 04:27:30 | 显示全部楼层

该用户从未签到

发表于 2011-7-14 08:33:57 | 显示全部楼层
我个人的理解是因为热成像是按照温度来显示不同的颜色,所以不能直接使用shader改变模型的颜色来实现这个效果,夜视应该就没这个问题。
事实上我个人认为用vertex attributes就可以实现这个效果了,当然这需要模型具有足够多的顶点数;另一种方法我认为是使用纹理作为lookup table

该用户从未签到

发表于 2011-7-14 10:56:50 | 显示全部楼层
本帖最后由 CWorld 于 2011-7-14 10:57 编辑

回复 5# monai1987


   抱歉,回复晚了,这也有一个帖子说了如何做:http://lists.openscenegraph.org/htdig.cgi/osg-users-openscenegraph.org/2007-August/001397.html 对于红外仿真,我也准备研究,有兴趣交流哈!

该用户从未签到

发表于 2011-7-14 11:26:21 | 显示全部楼层
回复 11# monai1987

cow.osg本身就没有纹理吧,你换个模型试试。另外就是如果用这个例子的话,要么你把noise跟那个望远镜形状的mask 这两个纹理加进去,或者在frag shader里把相关的部分按照你的需要作修改。

该用户从未签到

发表于 2011-7-14 11:29:34 | 显示全部楼层
回复 14# array

可否请您简单介绍下如何使用vertex attributes来实现红外的效果?

该用户从未签到

发表于 2011-7-14 12:56:20 | 显示全部楼层
我只是构想,之前我做过的红外效果纯粹是根据纹理来判断和生成的。这里无非就是如何获取数据的问题,现在考虑,还是用纹理做lookup table的设想更为合适

该用户从未签到

 楼主| 发表于 2011-7-14 18:28:06 | 显示全部楼层
回复 16# aya_daxiang


    "noise跟那个望远镜形状的mask 这两个纹理加进去......................"
     你说的是下面这两个参数吗?
  • uniform sampler2D noiseTex;
  • uniform sampler2D maskTex;

这两个参数怎么设置啊?

该用户从未签到

 楼主| 发表于 2011-7-14 18:30:03 | 显示全部楼层
回复 18# array


    老大,能介绍一下osgXI怎样配置吗?下的资料里怎么找不到lib文件。。。。

该用户从未签到

发表于 2011-7-15 08:10:13 | 显示全部楼层
我觉得这个貌似没什么可介绍的……下载NVIDIA Cg库作为依赖

该用户从未签到

 楼主| 发表于 2011-7-17 10:46:55 | 显示全部楼层
回复 21# array


    我用cmake将oxi中的例子生成工程文件,但是编译报错提示缺少.lib文件,哪位大哥有生成好的库文件啊?给我传一份行吗?

该用户从未签到

 楼主| 发表于 2011-7-17 23:14:42 | 显示全部楼层
库文件的问题解决了,谢谢大家了

该用户从未签到

发表于 2011-7-18 11:37:06 | 显示全部楼层
回复 19# monai1987

这两个是纹理,你把添加文理时设置得纹理单元 倒入uniform,比如mask的纹理单元为3,则osg::Uniform* param10 = new osg::Uniform( "maskTex", 3 );

其实夜视用不到这两个文理,noise是添加噪声,masktex是为了制造出从望远镜看出的效果,你完全可以把这些相关的代码先去掉,等确定了夜视的做法之后再慢慢按你的要求改进。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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