osgPBR(十五)镜面IBL--查看不同级别的HDR环境贴图

首先,设置可以使用Mipmap,启用三线性过滤,设置最大级别和最小级别

osg::ref_ptr<osg::TextureCubeMap> tcm = new osg::TextureCubeMap;
tcm->setTextureSize(128, 128);

tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
tcm->setUseHardwareMipMapGeneration(true);
tcm->setMinLOD(0);
tcm->setMaxLOD(4	);

然后在shader中,用textureLod分别查看各个级别
“gl_FragColor = textureLod(tex0,dir,4);\n”//0,1,2,3,4
运行如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码如下:
#include <osg/TextureCubeMap>
#include <osg/TexGen>
#include <osg/TexEnvCombine>
#include <osgUtil/ReflectionMapGenerator>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/NodeVisitor>
#include <osg/ShapeDrawable>

static const char * vertexShader =
{
“in vec3 aPos;\n”
“varying vec3 outPos;”
“void main(void)\n”
“{\n”
“outPos = aPos;\n”
" gl_Position = ftransform();\n"
“}\n”
};

static const char *psShader =
{
“varying vec3 outPos;”
“uniform samplerCube tex0;”
“void main(void)\n”
“{\n”
“float x = outPos.r;\n”
“float y = outPos.g;\n”
“float z = outPos.b;\n”
“vec3 dir = vec3(x,y,z);\n”
//“gl_FragColor = vec4(x,y,z,1);\n”
//“gl_FragColor = texture(tex0,dir);\n”
“gl_FragColor = textureLod(tex0,dir,2);\n”//0,1,2,3,4
“}\n”
};
class MyNodeVisitor : public osg::NodeVisitor
{
public:
MyNodeVisitor() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
{

}
void apply(osg::Geode& geode)
{
	int count = geode.getNumDrawables();
	for (int i = 0; i < count; i++)
	{
		osg::ref_ptr<osg::Geometry> geometry = geode.getDrawable(i)->asGeometry();
		if (!geometry.valid())
		{
			continue;
		}
		osg::Array* vertexArray = geometry->getVertexArray();
		geometry->setVertexAttribArray(1, vertexArray);

	}
	traverse(geode);
}

};

int main()
{
osg::ref_ptrosg::TextureCubeMap tcm = new osg::TextureCubeMap;
tcm->setTextureSize(128, 128);
tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);

std::string strImagePosX = "D:/hdr/Right face camera.bmp";
osg::ref_ptr<osg::Image> imagePosX = osgDB::readImageFile(strImagePosX);
tcm->setImage(osg::TextureCubeMap::POSITIVE_X, imagePosX);
std::string strImageNegX = "D:/hdr/Left face camera.bmp";
osg::ref_ptr<osg::Image> imageNegX = osgDB::readImageFile(strImageNegX);
tcm->setImage(osg::TextureCubeMap::NEGATIVE_X, imageNegX);

std::string strImagePosY = "D:/hdr/Front face camera.bmp";;
osg::ref_ptr<osg::Image> imagePosY = osgDB::readImageFile(strImagePosY);
tcm->setImage(osg::TextureCubeMap::POSITIVE_Y, imagePosY);
std::string strImageNegY = "D:/hdr/Back face camera.bmp";;
osg::ref_ptr<osg::Image> imageNegY = osgDB::readImageFile(strImageNegY);
tcm->setImage(osg::TextureCubeMap::NEGATIVE_Y, imageNegY);

std::string strImagePosZ = "D:/hdr/Top face camera.bmp";
osg::ref_ptr<osg::Image> imagePosZ = osgDB::readImageFile(strImagePosZ);
tcm->setImage(osg::TextureCubeMap::POSITIVE_Z, imagePosZ);

std::string strImageNegZ = "D:/hdr/Bottom face camera.bmp";
osg::ref_ptr<osg::Image> imageNegZ = osgDB::readImageFile(strImageNegZ);
tcm->setImage(osg::TextureCubeMap::NEGATIVE_Z, imageNegZ);
tcm->setUseHardwareMipMapGeneration(true);
tcm->setMinLOD(0);
tcm->setMaxLOD(4);

osg::ref_ptr<osg::Box> box = new osg::Box(osg::Vec3(0, 0, 0), 10);
osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(box);
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(drawable);
MyNodeVisitor nv;
geode->accept(nv);
osg::ref_ptr<osg::StateSet> stateset = geode->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0, tcm, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);

//shader

osg::ref_ptr<osg::Shader> vs1 = new osg::Shader(osg::Shader::VERTEX, vertexShader);
osg::ref_ptr<osg::Shader> ps1 = new osg::Shader(osg::Shader::FRAGMENT, psShader);
osg::ref_ptr<osg::Program> program1 = new osg::Program;
program1->addShader(vs1);
program1->addShader(ps1);
program1->addBindAttribLocation("aPos", 1);

osg::ref_ptr<osg::Uniform> tex0Uniform = new osg::Uniform("tex0", 0);
stateset->addUniform(tex0Uniform);
stateset->setAttribute(program1, osg::StateAttribute::ON);

osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setSceneData(geode);
viewer->realize();
return viewer->run();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: osgearth是一个开源的地球渲染引擎,基于OpenSceneGraph开发。它提供了各种功能和工具,用于创建和渲染高度复杂的地球场景。 osgearth的主要特点: 1. 地理数据支持:osgearth可以处理各种地理数据,包括DEM(数字高程模型)、地形纹理、矢量数据和卫星影像等。它支持多种数据格式,如GeoTIFF、Shapefile等,并提供了统一的API来加载和处理这些数据。 2. 地球渲染:osgearth通过大规模LOD(层次细节)技术来实现地球场景的渲染。它可以根据观察点的距离和角度,动态加载和显示不同细节级别的地理数据,以提供流畅的用户体验。 3. 场景定位和导航:osgearth支持场景的定位和导航,可以通过经纬度或地理坐标系统来定位场景中的对象。同时,它还提供了交互式的导航功能,包括缩放、旋转和平移等,使用户能够自由探索地球场景。 4. 地理参考系统:osgearth集成了各种地理参考系统(如WGS-84或UTM坐标系统),可以根据需要来选择合适的参考系统,并将地理数据转换为指定的坐标系统。 5. 插件系统:osgearth提供了一个灵活的插件系统,可以扩展其功能和功能。用户可以根据自己的需求编写自定义插件,以实现特定的地球渲染功能。 总之,osgearth是一个功能强大的地球渲染引擎,可以用于创建各种复杂的地球场景,具有广泛的地理数据支持和灵活的插件系统。 ### 回答2: OSG 3.6.5是一种开源的图形引擎,它是一个高性能的三维图形渲染库,可用于创建各种虚拟现实、增强现实和交互式的图形应用程序。OSG 3.6.5具有广泛的应用领域,包括游戏开发、科学可视化、建筑设计、仿真训练等。 而OSGEarth是OSG的一个扩展库,它提供了一套简单易用的接口和工具,用于在地球上渲染地理信息和卫星图像。OSGEarth使得开发人员能够轻松创建具有地球表面数据的图形应用程序,并实现真实感的地理环境。 OSG 3.6.5与OSGEarth的结合使得开发人员能够更好地处理地理信息,例如地形数据、卫星图像、地理坐标等。它提供了一系列功能强大的工具,用于加载、处理和渲染地理数据,以及在场景中添加地球表面的细节。 此外,OSG 3.6.5和OSGEarth还支持多种数据格式,包括DEM、DTED、地理信息系统(GIS)数据等,使开发人员能够方便地获取地球数据并进行交互式的可视化展示。 总而言之,OSG 3.6.5和OSGEarth是一对强大的开源库,用于创建高性能的三维图形应用程序,并处理地球表面的地理信息。它们为开发人员提供了丰富的功能和易用的接口,使得开发地理可视化应用程序变得更加高效和简单。 ### 回答3: osg 3.6.5 osgearth是一款开源的地理信息系统(GIS)软件包。其中osg 3.6.5是基于OpenSceneGraph(OSG)框架的版本,而osgearth则是OSG的一个插件,旨在为OSG的用户提供地球科学相关的功能和工具。 osg 3.6.5是一个功能强大且可扩展的三维图形引擎,可用于开发各种视觉仿真和虚拟现实应用程序。它支持多种平台,包括Windows,Linux和Mac OS,并且具有优秀的性能和稳定性。 osgearth作为osg的插件,为OSG提供了地理信息的处理和渲染能力。它可以加载和显示地球表面上的各种数据,例如地图、卫星图像、DEM数据等。同时,osgearth还提供了功能强大的地球数据处理工具,如地形转换、几何操作、投影变换等,使用户可以更方便地处理和显示地球科学数据。 osg 3.6.5 osgearth的优点包括: 1. 开源免费:osgearth是一个开源项目,用户可以自由获取并修改源代码,而且无需支付任何费用。 2. 易于使用:osgearth提供了简单易懂的接口和文档,使用户可以快速上手并开发出高质量的地图应用程序。 3. 功能丰富:osgearth支持多种地理数据的加载和渲染,提供了丰富的地球数据处理工具,可以满足大部分地球科学应用的需求。 4. 高性能:osg 3.6.5作为OSG的一个版本,具有优秀的渲染性能和稳定性,可以处理大规模、复杂的地球数据,保证应用程序的流畅运行。 综上所述,osg 3.6.5 osgearth是一款强大的地理信息系统软件包,提供了地球科学数据的处理和渲染能力,适用于各种视觉仿真和虚拟现实应用程序的开发。它的开源、易用、功能丰富和高性能是其优点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值