OSG/TextureCubeMap 立方贴图天空盒示例
原来实例带的图片不清楚,换做了opengl入门里面的图片:
#include <osgViewer/Viewer>#include <osg/Vec3>
#include <osg/Vec4>
#include <osg/Quat>
#include <osg/Matrix>
#include <osg/ShapeDrawable>
#include <osg/Geometry>
#include <osg/Geode>
#include <osg/Transform>
#include <osg/Material>
#include <osg/NodeCallback>
#include <osg/Depth>
#include <osg/CullFace>
#include <osg/TexMat>
#include <osg/TexGen>
#include <osg/TexEnv>
#include <osg/TextureCubeMap>#include <osgDB/WriteFile>
#include <osgDB/ReadFile>#include <osgUtil/Optimizer>#include <iostream>#pragma comment(lib, "OpenThreadsd.lib")
#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgUtild.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "osgTextd.lib")//读取立方图
osg::ref_ptr<osg::TextureCubeMap> readCubeMap()
{osg::ref_ptr<osg::TextureCubeMap> cubemap = new osg::TextureCubeMap;osg::ref_ptr<osg::Image> imagePosX = osgDB::readImageFile("right.jpg");osg::ref_ptr<osg::Image> imageNegX = osgDB::readImageFile("left.jpg");osg::ref_ptr<osg::Image> imagePosY = osgDB::readImageFile("down.jpg");osg::ref_ptr<osg::Image> imageNegY = osgDB::readImageFile("up.jpg");osg::ref_ptr<osg::Image> imagePosZ = osgDB::readImageFile("front.jpg");osg::ref_ptr<osg::Image> imageNegZ = osgDB::readImageFile("back.jpg");if (imagePosX.get() && imageNegX.get() && imagePosY.get() && imageNegY.get() && imagePosZ.get() && imageNegZ.get()){//设置立方图的六个面的贴图cubemap->setImage(osg::TextureCubeMap::POSITIVE_X, imagePosX.get());cubemap->setImage(osg::TextureCubeMap::NEGATIVE_X, imageNegX.get());cubemap->setImage(osg::TextureCubeMap::POSITIVE_Y, imagePosY.get());cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Y, imageNegY.get());cubemap->setImage(osg::TextureCubeMap::POSITIVE_Z, imagePosZ.get());cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Z, imageNegZ.get());//设置纹理环绕模式cubemap->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);cubemap->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);cubemap->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);//设置滤波:线形和mipmapcubemap->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);cubemap->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);}return cubemap.get();
}//更新立方体图纹理
struct TexMatCallback : public osg::NodeCallback
{public:TexMatCallback(osg::TexMat& tm) :_texMat(tm){//}virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);if (cv){//得到模型视图矩阵并设置旋转角度const osg::Matrix& MV = *(cv->getModelViewMatrix());const osg::Matrix R = osg::Matrix::rotate( osg::DegreesToRadians(112.0f), 0.0f,0.0f,1.0f)*osg::Matrix::rotate( osg::DegreesToRadians(90.0f), 1.0f,0.0f,0.0f);osg::Quat q = MV.getRotate();const osg::Matrix C = osg::Matrix::rotate( q.inverse() );//设置纹理矩阵_texMat.setMatrix( C*R );}traverse(node,nv);}//纹理矩阵osg::TexMat& _texMat;
};//一个变换类,使天空盒绕视点旋转
class MoveEarthySkyWithEyePointTransform : public osg::Transform
{public://局部矩阵计算成世界矩阵virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const {osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);if (cv){osg::Vec3 eyePointLocal = cv->getEyeLocal();matrix.preMult(osg::Matrix::translate(eyePointLocal));}return true;}//世界矩阵计算为局部矩阵virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const{osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);if (cv){osg::Vec3 eyePointLocal = cv->getEyeLocal();matrix.postMult(osg::Matrix::translate(-eyePointLocal));}return true;}
};//创建天空盒
osg::ref_ptr<osg::Node> createSkyBox()
{osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();//设置纹理映射方式,指定为替代方式,即纹理中的颜色代替原来的颜色osg::ref_ptr<osg::TexEnv> te = new osg::TexEnv;te->setMode(osg::TexEnv::REPLACE);stateset->setTextureAttributeAndModes(0, te.get(), osg::StateAttribute::ON| osg::StateAttribute::OVERRIDE);//自动生成纹理坐标,反射方式(REFLECTION_MAP)/*NORMAL_MAP 标准模式-立方图纹理REFLECTION_MAP 反射模式-球体纹理SPHERE_MAP 球体模型-球体纹理*/osg::ref_ptr<osg::TexGen> tg = new osg::TexGen;tg->setMode(osg::TexGen::NORMAL_MAP);stateset->setTextureAttributeAndModes(0, tg.get(), osg::StateAttribute::ON| osg::StateAttribute::OVERRIDE);//设置纹理矩阵osg::ref_ptr<osg::TexMat> tm = new osg::TexMat;stateset->setTextureAttribute(0, tm.get());//设置立方图纹理osg::ref_ptr<osg::TextureCubeMap> skymap = readCubeMap();stateset->setTextureAttributeAndModes(0, skymap.get(), osg::StateAttribute::ON| osg::StateAttribute::OVERRIDE);stateset->setMode( GL_LIGHTING, osg::StateAttribute::OFF );stateset->setMode( GL_CULL_FACE, osg::StateAttribute::OFF );//将深度设置为远平面osg::ref_ptr<osg::Depth> depth = new osg::Depth;depth->setFunction(osg::Depth::ALWAYS);depth->setRange(1.0,1.0);//远平面 stateset->setAttributeAndModes(depth, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);//设置渲染顺序为-1,先渲染stateset->setRenderBinDetails(-1,"RenderBin");osg::ref_ptr<osg::Drawable> drawable = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),1));//把球体加入到叶节点osg::ref_ptr<osg::Geode> geode = new osg::Geode;geode->setCullingActive(false);geode->setStateSet( stateset.get());geode->addDrawable(drawable.get());//设置变换osg::ref_ptr<osg::Transform> transform = new MoveEarthySkyWithEyePointTransform();transform->setCullingActive(false);transform->addChild(geode.get());osg::ref_ptr<osg::ClearNode> clearNode = new osg::ClearNode;clearNode->setCullCallback(new TexMatCallback(*tm));clearNode->addChild(transform.get());return clearNode.get();
}int main()
{osg::ref_ptr<osgViewer::Viewer> viewer= new osgViewer::Viewer();osg::ref_ptr<osg::Group> rootnode = new osg::Group();//加入天空盒rootnode->addChild(createSkyBox());// 加入模型rootnode->addChild(osgDB::readNodeFile("cow.osg"));//优化场景数据osgUtil::Optimizer optimzer;optimzer.optimize(rootnode.get());viewer->setSceneData(rootnode.get());viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));viewer->addEventHandler(new osgViewer::StatsHandler());//实现状态信息统计viewer->addEventHandler(new osgViewer::WindowSizeHandler());viewer->realize();viewer->run();return 0 ;
}
效果如下图所示:
OSG/TextureCubeMap 立方贴图天空盒示例相关推荐
- OpenGL 立方体贴图Cubemaps
OpenGL立方体贴图Cubemaps 立方体贴图Cubemaps简介 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 立方体贴图Cubemaps简介 我们已 ...
- LearnOpenGL 高级OpenGL—立方体贴图
文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...
- OpenGL ES 3. 天空盒 立方体贴图
大家好,接下来将为大家介绍OpenGL ES 3. 天空盒 立方体贴图. OpenGL ES 立方体贴图本质上还是纹理映射,是一种 3D 纹理映射.立方体贴图所使的纹理称为立方图纹理,它是由 6 个单 ...
- 第十八课,立方体贴图(加载天空盒)
原理我在这里不再过多叙述,主要从代码的运行方向来解读立方体贴图 添加天空盒顶点 float skyboxVertices[] = {// positions -1.0f, 1.0f, -1.0f,-1 ...
- UnityShader18.1:立方体贴图(下)
接上文:https://blog.csdn.net/Jaihk662/article/details/113248074 四.菲涅尔反射 菲涅尔反射(Fresnel Reflection)就是同时考虑 ...
- UnityShader18:立方体贴图(上)
一.天空盒 使用立方体贴图最直接的目的就是展现天空盒,或者更进一步用于实现环境映射(反射与折射) 关于立方体贴图的采样原理:https://blog.csdn.net/Jaihk662/article ...
- LearnOpenGL->立方体贴图
立方体贴图 立方体贴图 在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map). 简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都 ...
- OpenGL 核心技术之立方体贴图
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- OpenGL 入门 17:立方体贴图
立方体贴图(Cube Map) 立方体贴图是由"上下左右前后"6个2D纹理合并成的一张纹理.与2D纹理使用(u,v)坐标采样不同的是,立方体纹理使用一个方向向量进行采样. 1. 方 ...
- QT之OpenG立方体贴图
QT之OpenGL立方体贴图 1. 概述 2. 绘制天空盒 2.1 demo 3. 环境映射 3.1 反射 3.1.1 demo 3.1.2 3.2 折射 3.2.1 demo 4. 反射纹理 4.1 ...
最新文章
- linux gdb 运行的程序,GDB(十)--调试正在运行的进程
- C语言包含字母的2D面板中搜索给定的单词的算法(附完整源码)
- javascript实现汉诺塔动画效果
- html 图片 高度无效_HTML笔记(详细)
- 前端开发 表格元素 单元格的合并 0229
- Docker : Docker 安装ES
- Dockerfile封装Django镜像
- 拓端tecdat|R语言K-means和层次聚类分析癌细胞系微阵列数据和树状图可视化比较
- JAVA中的I/O流
- usbcan、can分析仪、can卡的产品特点和功能特点
- [转] 史上最全英文免费编程电子书列表
- weblogic部署war包
- 感知特性评价指标SSIM
- 企业研发人员配备比例_……企业职工人数、学历结构以及研发人员占企业职工比例说明...
- 从毕业生到高级工程师:三位腾讯高级程序员的感悟
- 《钱塘湖春行》-----白居易
- 介绍一个使用go写的TUI性能监测工具gotop
- noip模拟测试 主仆见证了 Hobo 的离别
- 云服务器文件打包,如何把云服务器的文件打包出来
- java网关限流_基于网关GateWay实现限流-令牌桶 及原理解析
热门文章
- 笔记本键盘扣安装注意事项(小技巧)
- sqldependency 的使用
- 论文写作——latex三线表tabular*文本居中与正文两端对齐、标题加黑
- 天涯明月刀服务器维护,天涯明月刀手游维护时间表一览,维护什么时候结束?[多图]...
- idea保存快捷键_IntelliJ IDEA 快捷键大全 | 终极版
- Xcode9引第三方报错 linker command failed with exit code 1 (use -v to see invocation)
- PGIS 天地图主题颜色背景修改 图片 filter 蓝色 HTML CSS IMG filter 颜色矩阵在线计算 RGBA转换 SVG feColorMatrix
- CPC客户端安装教程(2022/4/1)
- Android代码中设置横屏
- 韩家炜课题组重磅发文:文本分类只需标签名称,不需要任何标注数据!