OSG仿真案例(0)

//实现基于颜色的材质映射,只有一个地球//调用dll,而不是使用自源程序
int Metr_ClassificationOnlyOneEarth()
{
   osgViewer::Viewer *viewer = new osgViewer::Viewer;

   ref_ptr<osgDB::Options>  a = new osgDB::Options(std::string("noTriStripPolygons"));//读取一个模型数据

   osg::ref_ptr<osg::Node> earthNode = osgDB::readNodeFile("G:/YCThirdParty/EarthData/demo.earth", a);//osg::ref_ptr<osg::Node> earthNode = osgDB::readNodeFile("D:/OSG/osgEarth_2.7.0/src/applications/osgearth_package_qt/data/base.earth");

   if (!earthNode)
   {
       OE_NOTICE << "Unable to load earth model" << std::endl;
       return 1;
   }

   //查询地图节点
   osgEarth::MapNode* mapNode = osgEarth::MapNode::findMapNode(earthNode);
   if (!mapNode)
   {
       OE_NOTICE << "Could not find MapNode " << std::endl;
       return 1;
   }
   MyDllClass md;
   md.EarthShader(mapNode);
   //addSky(mapNode);

   osg::ref_ptr<osg::Group> root = new osg::Group();

   root->addChild(mapNode);
   //添加到场景
   viewer->setSceneData(root.get());

   viewer->getLight()->setAmbient(osg::Vec4f(0.0, 0.0, 0.0, 0.0));
   viewer->getLight()->setDiffuse(osg::Vec4f(0.0, 0.0, 0.0, 0.0));
   viewer->realize();

   return viewer->run();
}

自己建的一个类:

#pragma once
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport )//注意decl前面是两个下划线
#else
#define MYDLL_API __declspec(dllimport)
#endif
 
namespace MyDllSpace
{
    //导出类
    class MyDllClass
    {
    private:
        double a;
    public:
        //导出的函数
        MYDLL_API MyDllClass();
 
        MYDLL_API void VirtualProgram(osgEarth::VirtualProgram* vp);
        MYDLL_API void EarthShader(osg::Group* root);

    };
}

类的代码如下:

#include <iostream>

#define MYDLL_EXPORTS

#include "MyDll.h"
MyDllSpace::MyDllClass::MyDllClass()
{
}

MYDLL_API void MyDllSpace::MyDllClass::VirtualProgram(osgEarth::VirtualProgram* vp)
{
    {
        std::string haze_vertex = "varying vec3 v_pos;                          \n"
            "varying vec3 oe_Normal;                                            \n"
            "varying vec3 osg_Normal;                                           \n"
            "void setup_haze(inout vec4 vertex)                                 \n"
            "{                                                                  \n"
            "   //v_pos = osg_Normal.xyz;                                       \n"
            "   //v_pos = normalize(gl_NormalMatrix * gl_Normal);               \n"
            "   v_pos = normalize(gl_NormalMatrix * gl_Normal);                 \n"
            "   //v_pos = oe_Normal;                                            \n"
            "}";
        //使用shader写rgb转lab空间
        std::string haze_fragment = "varying vec3 v_pos;                        \n"
            "uniform vec3 direction_color;                                      \n"
            "void apply_haze(inout vec4 color)                                  \n"
            "{                                                                  \n"
            "       float Metr_Color;                                           \n"
            "       float RR =  255.0*(color.x);                                \n"
            "       float GG =  255.0*(color.y);                                \n"
            "       float BB =  255.0*(color.z);                                \n"
            "if (RR>130 && BB<110)                                                  \n"//湿土地
            "{                                                                      \n"
            "Metr_Color = 0.85f;                                                    \n"
            "color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);                \n"
            "}                                                                      \n"
            "else                                                                   \n"
            "{                                                                      \n"
            "   if (RR>110 && GG>110 && BB>110 && GG<150 && RR<150 && BB<150)       \n"//城市沥青水泥
            "   {                                                                   \n"
            "       Metr_Color = 0.9f;                                              \n"
            "       color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);         \n"
            "   }                                                                   \n"
            "   else                                                                \n"
            "   {                                                                   \n"
            "       if (RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0)             \n"//绿色植被
            "       {                                                               \n"
            "           Metr_Color = 0.95f;                                         \n"
            "           color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);     \n"
            "       }                                                               \n"
            "       else                                                            \n"
            "       {                                                               \n"
            "           if (RR >180.0&& GG>180.0&BB>180.0)                          \n"//冰川雪山————暂时未知
            "           {                                                           \n"
            "               Metr_Color = 0.555555f;                                 \n"
            "               color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f); \n"
            "           }                                                           \n"
            "           else                                                        \n"
            "           {                                                           \n"
            "               if ((BB <197.0&&BB >27.0&&RR>21 && RR<98 && GG>22.0&&GG < 148.0 && (!(RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0))))    \n"//海洋水面
            "               {                                                                       \n"
            "                   Metr_Color = 0.98f;                                                 \n"
            "                   color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);             \n"
            "               }                                                                       \n"
            "               else                                                                    \n"
            "               {                                                                       \n"
            "                   if (RR>101 && GG>100 && BB>120 && (GG - BB>10) && (RR - GG>10))     \n"//干燥裸土
            "                   {                                                                   \n"
            "                       Metr_Color = 0.80f;                                             \n"
            "                       color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);         \n"
            "                   }                                                                   \n"
            "                   else                                                                \n"
            "                   {                                                                   \n"
            "                       Metr_Color = 0.930f;                                            \n"
            "                       color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);         \n"//其他未知
            "                   }                                                                   \n"
            "               }                                                                       \n"
            "                                                                                       \n"
            "           }                                                                           \n"
            "                                                                                       \n"
            "       }                                                                               \n"
            "                                                                                       \n"
            "   }                                                                                   \n"
            "   }                                                                                   \n"
            "}  ";

        //森林:RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0
        //雪山:RR >180.0&& GG>180.0&BB>180.0
        //海洋:(BB <197.0&&BB >27.0&&RR>21&&RR<98&& GG>22.0&&GG < 148.0&&(!(RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0)))
        //沙漠:( RR>121 &&GG>100&&BB>120&&(GG-BB>10)&&(RR-GG>10))(澳大利亚有一部分没有分进,可能是起步点设置太大)
        //城市:( RR>110 &&GG>110&&BB>110&&GG<150&&RR<150&&BB<150)
        //发射率表:{干燥裸土:0.8/0.4(发射率/反射率),低植覆盖:0.95/0.8,混凝土沥青:0.9/0.25,海面:0.98,湿土地:0.85/0.2}

        //参数1:被调用的函数名字,参数2:函数的字符串索引(也可能功能是文件的路径中的内容——待定),参数3:函数被加入的位置
        vp->setFunction("setup_haze", haze_vertex, osgEarth::ShaderComp::LOCATION_VERTEX_CLIP);//将自定义着色器函数setup_haze(),放在系统默认main函数中LOCATION_VERTEX_CLIP下面。
        vp->setFunction("apply_haze", haze_fragment, osgEarth::ShaderComp::LOCATION_FRAGMENT_COLORING);
    }

}

MYDLL_API void MyDllSpace::MyDllClass::EarthShader(osg::Group* root)
{
    
    {
#if 1
        {//自己写太阳法线着色2020年7月3日10:29:49,参考:可以实现从制动角度输入光源,和法相作用,在地球上产生光照效果,问题是:鼠标操作时,物体会移动,光源不移动,感觉是光源没有挂到这个地球的node上。而是和相机还是viewer还是视口跟着走了,需要进一步研究2020年7月6日17:02:34
            osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();
            stateset = root->getOrCreateStateSet();
            stateset->setMode(GL_LIGHTING, osg::StateAttribute::ON);                // 启用光照
            stateset->setMode(GL_LIGHT0, osg::StateAttribute::ON);              // 启用指定光源

            stateset->addUniform(new osg::Uniform("direction_color", osg::Vec3f(0.583867f, 0.714617f, 0.385256f)));     //0.583867       0.714617       0.385256
            osgEarth::VirtualProgram* vp = osgEarth::VirtualProgram::getOrCreate(stateset);
            VirtualProgram(vp);
        }
#endif 
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352