OSG开发笔记(十五):OSG光照

该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/96473289

目录

前言

OSG光照

地球光照效果

设置光照后的效果

白光

红光

光照实现方式与步骤

光照代码

入坑

入坑一:光照后的效果是黑色

工程模板:对应版本号1.12.0


 

OSG三维开发专栏

OSG开发笔记(一):OSG介绍、编译

OSG开发笔记(二):OSG帮助文档编译

OSG开发笔记(三):OSG使用osgQt嵌入Qt应用程序

OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序》:

OSG开发笔记(五):OSG场景理解与基础类概述

OSG开发笔记(六):OSG内存管理

OSG开发笔记(七):OSG复现OpenGL入门示例和OSG坐标系

OSG开发笔记(八):OSG模型文件存储与读取

OSG开发笔记(九):OSG模型的基本操作之添加/删除、显示/隐藏、开关节点开/》:

OSG开发笔记(十):OSG模型的变换之平移、旋转和缩放

OSG开发笔记(十一):OSG渲染状态与2D纹理映射

OSG开发笔记(十二):OSG基本几何图形、内置几何类型

OSG开发笔记(十三):OSG三维纹理映射(体渲染)

OSG开发笔记(十四):OSG交互

OSG开发笔记(十五):OSG光照

OSG开发笔记(十六):OSG视口、相机和视点

OSG开发笔记(十七):OSG中的相机移动

OSG开发笔记(十八):OSG鼠标拾取pick、拽托球体以及多光源

OSG开发笔记(十九):OSG文字显示

OSG开发笔记(二十):OSG使用HUD显示文字

OSG开发笔记(二十一):OSG使用HUD绘制图形以及纹理混合模式

OSG开发笔记(二十二):OSG场景背景

OSG开发笔记(二十三):Qt使用QOpenGLWidget渲染OSG地球仪

OSG开发笔记(二十四):OSG漫游之平移、转向和低抬头

OSG开发笔记(二十五):OSG漫游之CS移动、碰撞检测与跳跃

OSG开发笔记(二十六):OSG漫游之上下楼梯

《OSG开发笔记(二十七):OSG路径漫游之录制播放固定路径动画

《OSG开发笔记(二十八):OSG模型固定路径动画

  持续补充中…

 

                 OSG开发笔记(十五):OSG光照

 

前言

       上一篇章实现的地球仪,放大的时候变暗了,而对于我们的理解,放大应该越近越清楚越亮,这就是光照的原因。

 

OSG光照

       OSG全面支持OpenGL的光照特性,包括材质属性、光照属性和光照模型。与OpenGL相似,OSG中的光源也是不可见的,二非渲染一个灯泡或者其他自然形状。同样,光源会创建着色效果,但并不创建阴影,额外的阴影可以使用osgShadow可以用来创建。

光照:osg::Light

光源:osg::LightSource

 

地球光照效果

       默认光照, 随着地球越放大,显示越来越暗。

       OSG开发笔记(十五):OSG光照_第1张图片

 

设置光照后的效果

白光

        注意,不断放大,会突然变黑,是因为球体放大,观察点到球体内部去了)

       OSG开发笔记(十五):OSG光照_第2张图片

红光

        OSG开发笔记(十五):OSG光照_第3张图片

 

光照实现方式与步骤

       光照实现步骤是:

  • 打开光照,设置光照序号(与打开光照序号的灯光功能对应);
  • 创建光照(理解为光点,光从该点射出),设置光照属性(光的位置,光的方向,光的颜色,常量衰减指数,线性衰减,二次衰减指数,可关闭衰减);
  • 以光照创建光源,将光源添加进父结点中。

        

        OSG开发笔记(十五):OSG光照_第4张图片

 

光照代码

osg::ref_ptr OsgWidget::getEarthSphiereLight()
{
    // 该结点是为了开关
    osg::ref_ptr pSwitch = new osg::Switch;
    // 该结点是为了变换
    osg::ref_ptr pTrans = new osg::MatrixTransform;
    // 该结点是为了灯光
    osg::ref_ptr pLightSource = new osg::LightSource;
#if 1
    {
        // 绘制球体
        // 步骤一:绘制几何类型(几何体)
        osg::ref_ptr pGeode = new osg::Geode;
        qreal radius = 1.0;
        pGeode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0, 0, 0), radius)));
        // 步骤二:加载图片添加纹理
        osg::ref_ptr pImage;
        pImage = osgDB::readImageFile("D:/qtProject/osgDemo/osgDemo/modules/osgWidget/image/earth.bmp");
        osg::ref_ptr pTexture2D = new osg::Texture2D;
        pTexture2D->setImage(pImage.get());
        // 步骤三:渲染设置
        osg::ref_ptr pStateSet = pGeode->getOrCreateStateSet();
        pStateSet->setTextureAttribute(0, pTexture2D.get());
        pStateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON);
        pTrans->addChild(pGeode);

        // 步骤四:打开光照(开关节点得光照)
        pStateSet = pSwitch->getOrCreateStateSet();
        pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
        pStateSet->setMode(GL_LIGHT0, osg::StateAttribute::ON);
        // 步骤五:创建光照对象
        osg::ref_ptr pLight = new osg::Light();
        // 设置光照对应的光照点,对应GL_LIGHT0
        pLight->setLightNum(0);
        // 设置光照方向
        pLight->setDirection(osg::Vec3(0.0, 1.0, 0.0));
        // 设置光照位置,最后一个参数0-平行光,1-点光源
        pLight->setPosition(osg::Vec4(0.0, -2.0, 0.0, 0.0));
        // 设置散射光颜色: 红光/白光
        pLight->setDiffuse(osg::Vec4(1.0, 1.0, 1.0, 1.0));
        // 设置常量衰减指数
        pLight->setConstantAttenuation(1.0);
        // 设置线行衰减指数
        pLight->setLinearAttenuation(0.0);
        // 设置二次衰减指数
        pLight->setQuadraticAttenuation(0.0);
        // 创建光源
        pLightSource->setLight(pLight.get());
        // 步骤六:添加事件管理器
//        _pViewer->addEventHandler(new MyUserEventHandler);
    }
#endif
    pSwitch->addChild(pTrans.get());
    // 添加光源(光源与球体平级结点,球体变换,光源不变换)
    pSwitch->addChild(pLightSource.get());
    return pSwitch.get();
} 

 

入坑

入坑一:光照后的效果是黑色

        OSG开发笔记(十五):OSG光照_第5张图片

解决方法:

       常量衰减不小心设为了0,应设置为1.0

 

工程模板:对应版本号1.12.0

        对应版本号1.12.0


原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/96473289

你可能感兴趣的:(Qt开发专栏,OSG,OSG三维开发专栏)