我要发帖 回复

管理员

730

主题

1万

积分

28

专家分

忠于职守杰出贡献鼓励

兴趣点(最多三项):

建模技术

私信
发表时间 : 2013-11-14 23:00:17 | 浏览 : 6491    评论 : 67
源码分类
原创性: 其他渠道
源码类型: osg|osgEarth
支撑软件: osg
目录截图:
文件大小: 1 Mb
代码开放性: 完全开源
  1. #include <osg/Geometry>
  2. #include <osg/Group>
  3. #include <osg/Texture2D>
  4. #include <osg/TextureCubeMap>
  5. #include <osgDB/ReadFile>
  6. #include <osgViewer/Viewer>

  7. osg::ref_ptr<osg::Geometry> createPlane( float length, float width )
  8. {
  9.         osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;
  10.         vec->resize( 8 );
  11.         (*vec)[0] = osg::Vec3f(  length, 0, width )*0.5;
  12.         (*vec)[1] = osg::Vec3f( -length, 0, width )*0.5;
  13.         (*vec)[2] = osg::Vec3f( -length, 0,-width )*0.5;
  14.         (*vec)[3] = osg::Vec3f(  length, 0,-width )*0.5;

  15.         osg::ref_ptr<osg::Vec3Array> nor = new osg::Vec3Array;
  16.         nor->push_back( osg::Vec3f( 0.0, -1.0, 0.0 ) );

  17.         osg::ref_ptr<osg::Vec2Array> tex = new osg::Vec2Array;
  18.         tex->push_back( osg::Vec2f(5.0, 5.0) );
  19.         tex->push_back( osg::Vec2f(0.0, 5.0) );
  20.         tex->push_back( osg::Vec2f(0.0, 0.0) );
  21.         tex->push_back( osg::Vec2f(5.0, 0.0) );

  22.         osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
  23.         geo->setVertexArray( vec.get() );
  24.         geo->setTexCoordArray( 0, tex.get() );
  25.         geo->setNormalArray( nor.get() );
  26.         geo->setNormalBinding( osg::Geometry::BIND_PER_PRIMITIVE_SET );
  27.         geo->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 4 ) );

  28.         return geo;
  29. }

  30. osg::TextureCubeMap* readCubeMap()
  31. {
  32.         osg::TextureCubeMap* cubemap = new osg::TextureCubeMap;

  33.         osg::Image* imagePosX = osgDB::readImageFile( "cubemap/posx.bmp" );
  34.         osg::Image* imageNegX = osgDB::readImageFile( "cubemap/negx.bmp" );
  35.         osg::Image* imagePosY = osgDB::readImageFile( "cubemap/posy.bmp" );
  36.         osg::Image* imageNegY = osgDB::readImageFile( "cubemap/negy.bmp" );
  37.         osg::Image* imagePosZ = osgDB::readImageFile( "cubemap/posz.bmp" );
  38.         osg::Image* imageNegZ = osgDB::readImageFile( "cubemap/negz.bmp" );

  39.         if (imagePosX && imageNegX && imagePosY /*&& imageNegY && imagePosZ && imageNegZ*/)
  40.         {
  41.                 cubemap->setImage(osg::TextureCubeMap::POSITIVE_X, imagePosX);
  42.                 cubemap->setImage(osg::TextureCubeMap::NEGATIVE_X, imageNegX);
  43.                 cubemap->setImage(osg::TextureCubeMap::POSITIVE_Y, imagePosY);
  44.                 cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Y, imageNegY);
  45.                 cubemap->setImage(osg::TextureCubeMap::POSITIVE_Z, imagePosZ);
  46.                 cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Z, imageNegZ);

  47.                 cubemap->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
  48.                 cubemap->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
  49.                 cubemap->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);

  50.                 cubemap->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
  51.                 cubemap->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
  52.         }

  53.         return cubemap;
  54. }


  55. class updateShader : public osg::Uniform::Callback
  56. {
  57. public:
  58.         updateShader() : time(0.0), dir(true) {}
  59.         virtual void operator() ( osg::Uniform* uniform, osg::NodeVisitor* nv )
  60.         {
  61.                 time += 0.03;
  62.                 uniform->set( time );
  63.         }

  64.         bool dir;
  65.         float time;
  66. };

  67. int main(int argc, char** argv)
  68. {
  69.         osg::Group* root = new osg::Group;
  70.         osg::Geode* model = new osg::Geode;
  71.         model->addDrawable( createPlane(5, 5).get() );
  72.         //osg::Node* model = osgDB::readNodeFile( "cow.osg" );
  73.         root->addChild( model );

  74.         osg::StateSet* stateset = model->getOrCreateStateSet();
  75.         osg::Shader* vertexShader = new osg::Shader( osg::Shader::VERTEX );
  76.         osg::Shader* fragmentShader = new osg::Shader( osg::Shader::FRAGMENT );
  77.         vertexShader->loadShaderSourceFromFile( "ocean.vert" );
  78.         fragmentShader->loadShaderSourceFromFile( "ocean.frag" );

  79.         osg::Program* program = new osg::Program;
  80.         program->addShader( vertexShader );
  81.         program->addShader( fragmentShader );
  82.         stateset->setAttributeAndModes( program, osg::StateAttribute::ON );

  83.         osg::Uniform* param1 = new osg::Uniform( "LightPos", osg::Vec3(1.0, 1.0, 0.0) );
  84.         stateset->addUniform( param1 );
  85.         osg::Uniform* param2 = new osg::Uniform( "time", 0.0f );
  86.         param2->setUpdateCallback( new updateShader );
  87.         stateset->addUniform( param2 );
  88.         osg::Uniform* param3 = new osg::Uniform( "normalMap", 0 );
  89.         stateset->addUniform( param3 );
  90.         osg::Uniform* param4 = new osg::Uniform( "cubeMap", 1 );
  91.         stateset->addUniform( param4 );

  92.         osg::Image* image = osgDB::readImageFile( "water.bmp" );
  93.         osg::Texture2D* tex = new osg::Texture2D( image );
  94.         tex->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
  95.         tex->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
  96.         tex->setWrap(osg::Texture::WRAP_R, osg::Texture::REPEAT);
  97.         tex->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
  98.         tex->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
  99.         stateset->setTextureAttributeAndModes( 0, tex, osg::StateAttribute::ON );

  100.         stateset->setTextureAttributeAndModes( 1, readCubeMap(), osg::StateAttribute::ON );

  101.         osgViewer::Viewer viewer;
  102.         viewer.setSceneData( root );
  103.         viewer.realize();
  104.         
  105.         return viewer.run();
  106. }
复制代码
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1积分 +5 收起 理由
skylimite + 5 很给力!

查看全部评分

最近VR访客查看更多↓

UE4   |   虚幻引擎   |   Unity VR    |    Hololens
csutest 评论于2013-11-15 01:03:42
多谢分享
haifeng60902 评论于2013-11-15 09:32:23
看看,谢谢了
haha459862 评论于2013-11-15 21:21:08
感谢分享,资料真多
shengma 评论于2013-11-16 07:40:14
谢谢分享,学习了。
mysu30mkk 评论于2013-11-19 17:13:11
shengma 发表于 2013-11-16 07:40 AM
谢谢分享,学习了。


多谢分享
来自河北1 评论于2013-11-21 09:27:05
求分享啊
Captain_Jack 评论于2013-11-28 15:46:25
osg通过shader实现的水面效果
人生转角 评论于2013-12-3 21:30:31
感谢楼主!
hgyzj 评论于2013-12-6 20:13:30
学习了,感谢
bluefish 评论于2013-12-10 08:35:14
谢谢分享。
但是,里面的 bmp文件需要从哪里获得呢?
mestone 评论于2013-12-11 11:22:25
谢谢分享
freeman专家组 评论于2013-12-24 22:52:17
看看效果如何,
david_m 评论于2013-12-28 12:46:19
freeman 发表于 2013-12-24 10:52 PM
看看效果如何,

高级特性还是比较牛啊
勤省,笃学,自强
zyc1 评论于2014-1-5 16:33:41
多谢分享
westshell 评论于2014-1-12 20:33:57
谢谢分享
flesh0731 评论于2014-1-13 13:09:56
谢谢分享
chinawalltin 评论于2014-2-12 12:12:50
很好 谢谢 顶一下
wangsli2011 评论于2014-3-16 22:20:39
看看,学习下
GoldBetter 评论于2014-3-20 09:53:56
谢谢分享,学习一下。

手机版|VR开发网 |网站地图 统计  津ICP备16006248号

GMT+8, 2017-9-27 12:12 AM

返回顶部