查看: 2611|回复: 8

osg::TextureCubeMap 不能显示exr格式的图片

[复制链接]

该用户从未签到

发表于 2012-7-16 15:38:30 | 显示全部楼层 |阅读模式
osg::TextureCubeMap* readCubeMap()
{
        osg::TextureCubeMap* cubemap = new osg::TextureCubeMap;

        osg::Image* imagePosX = osgDB::readImageFile("qing.exr");
        osg::Image* imageNegX = osgDB::readImageFile("qing.exr");
        osg::Image* imagePosY = osgDB::readImageFile("qing.exr");
        osg::Image* imageNegY = osgDB::readImageFile("qing.exr");
        osg::Image* imagePosZ = osgDB::readImageFile("qing.exr");
        osg::Image* imageNegZ = osgDB::readImageFile("qing.exr");

        if (imagePosX && imageNegX && imagePosY && imageNegY && imagePosZ && imageNegZ)
        {
                //设置立方图的六个面的贴图
                cubemap->setImage(osg::TextureCubeMap:OSITIVE_X, imagePosX);
                cubemap->setImage(osg::TextureCubeMap::NEGATIVE_X, imageNegX);
                cubemap->setImage(osg::TextureCubeMap::POSITIVE_Y, imagePosY);
                cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Y, imageNegY);
                cubemap->setImage(osg::TextureCubeMap::POSITIVE_Z, imagePosZ);
                cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Z, imageNegZ);

                //设置纹理环绕模式
                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);

                //设置滤波:线形和mipmap
                cubemap->setFilter(osg::Texture::MIN_FILTER, osg::Texture:INEAR_MIPMAP_LINEAR);
                cubemap->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
        }

        return cubemap;
}

        //设置立方图纹理
        osg::TextureCubeMap* skymap = readCubeMap();
        stateset->setTextureAttributeAndModes(0, skymap, osg::StateAttribute::ON| osg::StateAttribute::OVERRIDE);

        stateset->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
        stateset->setMode( GL_CULL_FACE, osg::StateAttribute::OFF );

        osg:rawable* drawable = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),70.0));

        //把球体加入到叶节点
        osg::Geode* geode = new osg::Geode;
        geode->setCullingActive(false);
        geode->setStateSet( stateset );
        geode->addDrawable(drawable);

把上面的cubemap赋给 Sphere ,球显示出来了,但没有纹理,请问一下可能的原因是什么?
(跟踪发现cubemap的6个image都有内容,但就是显不出来,只能看到一个白球。如果用jpg的图片就可以显示出来)

期盼您的回复

该用户从未签到

 楼主| 发表于 2012-7-16 18:46:26 | 显示全部楼层
本帖最后由 heye 于 2012-7-16 18:46 编辑

osg::TextureCubeMap是否支持 浮点值纹理?  exr 中的像素值有浮点型的

感谢您的回复

该用户从未签到

 楼主| 发表于 2012-7-17 20:14:41 | 显示全部楼层
osg::TextureCubeMap是否支持 浮点值纹理?或者与显卡有关?
查了许久没查出结果……

该用户从未签到

发表于 2012-7-18 09:29:45 | 显示全部楼层
如果用OpenEXR编译了osgdb_exr库的话,是可以直接读取exr格式的

该用户从未签到

 楼主| 发表于 2012-7-18 10:27:41 | 显示全部楼层
本帖最后由 heye 于 2012-7-18 10:30 编辑

非常感激 array的回复。
“如果用OpenEXR编译了osgdb_exr库的话,是可以直接读取exr格式的”的确如您所说。
如果用texture2D(单张exr)是可以显示出来的,但如果用cubemap(6张exr)就显不出来(如果从cubemap里获取的话,还是能获取到的)。

如下设置后还是不能显示:
        osg::TextureCubeMap* cubemap = new osg::TextureCubeMap;
        cubemap->setInternalFormat(GL_RGB16F_ARB);
        cubemap->setSourceFormat(GL_RGB);
        cubemap->setSourceType(GL_HALF_FLOAT_ARB);

显卡:N卡 GT 240

焦盼您的指导

该用户从未签到

 楼主| 发表于 2012-7-19 08:46:50 | 显示全部楼层
查不出原因

该用户从未签到

发表于 2012-7-19 08:58:06 | 显示全部楼层
这个你先用OpenGL的试试呢? 看能不能行。

该用户从未签到

 楼主| 发表于 2012-7-20 11:33:29 | 显示全部楼层
感谢cworld的指导

用OpenGL不知道怎么读出 exr ( 也没有对应的exr插件)
猜测 opengl 应该可以,opengl的cubemap 直接用6个glTexImage2D();

该用户从未签到

发表于 2012-7-23 10:30:56 | 显示全部楼层
您当然需要同时读6幅纹理才可以,exr格式本身并不是天空盒。如果想要从一幅图里直接读出6张纹理,那么只要自己写一个切分的函数就可以了,我在osgXI中实现过这样的函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表