五,修改.hdr插件

news2024/11/28 2:49:54

由于辐照度贴图是.hdr格式,
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, data);

osg的.hdr插件需要修改,否则格式不对。
即在ReaderWriterHDR::readImage()中修改,

	bool convertToRGB8 = true;

		int pixelFormat = GL_RGB;
        int dataType = GL_UNSIGNED_BYTE;

		int internalFormat = GL_RGB16;
		img->setImage(res.width, res.height, 1,
			internalFormat, // Why this value are here?
			pixelFormat,
			dataType,
			(unsigned char*)rgb,
			osg::Image::USE_NEW_DELETE);

直接把该函数拷贝过来。

virtual ReadResult readImage(const std::string &_file, const osgDB::ReaderWriter::Options *_opts) const
{
    std::string filepath = osgDB::findDataFile(_file, _opts);
    if (filepath.empty())
        return ReadResult::FILE_NOT_FOUND;

    if (!HDRLoader::isHDRFile(filepath.c_str()))
        return ReadResult::FILE_NOT_HANDLED;

    float mul = 1.0f;
    bool bYFlip = false;
    //bool convertToRGB8 = false;
	bool convertToRGB8 = true;
    bool rawRGBE = false;
    if(_opts)
    {
        std::istringstream iss(_opts->getOptionString());
        std::string opt;
        while (iss >> opt)
        {
            if(opt == "RGBMUL")
            {
                iss >> mul;
            }
            else if(opt == "RGB8")
            {
                convertToRGB8 = true;
            }
            /* RAW: store the RGBE values into a Image, to use this option you
             * need to decode the RGBE value in the fragment shader. Follow
             * the cube map glsl decoder:
             *
             * vec4 textureCubeRGBE( uniform samplerCube sampler, vec3 coords )
             * {
             *     ivec4 rgbe = textureCube( sampler, coords ) * 255. + 0.5;
             *     float e = rgbe.a - ( 128 + 8 );
             *     return vec4( rgbe.rgb * exp2( e ), 1.0 );
             * }
             *
             */
            else if(opt == "RAW")
            {
                rawRGBE = true;
            }
            else if(opt == "YFLIP")
            {
                bYFlip = true; // Image is flipped later if required
            }
        }
    }

    HDRLoaderResult res;
    bool ret = HDRLoader::load(filepath.c_str(), rawRGBE, res);
    if (!ret)
        return ReadResult::ERROR_IN_READING_FILE;

    // create the osg::Image to fill in.
    osg::Image *img = new osg::Image;

    // copy across the raw data into the osg::Image

#if 1
if (convertToRGB8)
{
int nbPixs = res.width * res.height;
int nbElements = nbPixs * 3;
unsigned char *rgb = new unsigned char[ nbElements ];
unsigned char *tt = rgb;
float *cols = res.cols;

        for (int i = 0; i < nbElements; i++) {
            float element = *cols++;
            element *= mul;

			if (element < 0)
			{
				element = 0;
			}
			else if (element > 1)
			{
				element = 1;
			}
            int intElement = (int) (element * 255.0f);
            *tt++ = intElement;
        }

        delete [] res.cols;

		int pixelFormat = GL_RGB;
        int dataType = GL_UNSIGNED_BYTE;

        img->setFileName(filepath.c_str());

#if 0
img->setImage( res.width, res.height, 1,
3, // Why this value are here?
pixelFormat,
dataType,
(unsigned char*) rgb,
osg::Image::USE_NEW_DELETE);
#else
int internalFormat = GL_RGB16;
img->setImage(res.width, res.height, 1,
internalFormat, // Why this value are here?
pixelFormat,
dataType,
(unsigned char*)rgb,
osg::Image::USE_NEW_DELETE);

#endif
}
else
{
int internalFormat;
int pixelFormat;
int dataType = GL_FLOAT;

        if (rawRGBE)
        {
            internalFormat = GL_RGBA8;
            pixelFormat = GL_RGBA;
        } else {
            internalFormat = GL_RGB32F_ARB;
            pixelFormat = GL_RGB;
        }

        img->setFileName(filepath.c_str());
        img->setImage(  res.width, res.height, 1,
                        internalFormat,
                        pixelFormat,
                        dataType,
                        (unsigned char*) res.cols,
                        osg::Image::USE_NEW_DELETE);
    }

#else
{
//转换到RGB16,GL_Float
img->setFileName(filepath.c_str());
int nbPixs = res.width * res.height;
int nbElements = nbPixs * 3;
int internalFormat = GL_RGB16;
int pixelFormat = GL_RGB;
int dataType = GL_RGBA;
img->allocateImage(res.width, res.height, 1, GL_RGB, GL_FLOAT);
float* ptr = (float*)img->data();
float *cols = res.cols;

		for (int row = 0; row < res.height; row++)
		{
			for (int coloumn = 0; coloumn < res.width; coloumn++)
			{
				*ptr++ = *cols++;
				*ptr++ = *cols++;
				*ptr++ = *cols++;
			}
		}
		delete[] res.cols;


		
	}

#endif
// Y flip
if(bYFlip==true) img->flipVertical();

    return img;
}

结果如下:
在这里插入图片描述
加载图片代码如下:
#include <osg/TextureCubeMap>
#include <osg/TexGen>
#include <osg/TexEnvCombine>
#include <osgUtil/ReflectionMapGenerator>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/NodeVisitor>
#include <osg/ShapeDrawable>
#include <osg/Texture2D>

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 = texture(tex0,dir);\n”
“}\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()
{
std::string strHDRImageName = “D:/tutorial/LearnOpenGL-master/LearnOpenGL-master/resources/textures/hdr/newport_loft.hdr”;
osg::ref_ptrosg::Image image = osgDB::readImageFile(strHDRImageName);

int imageWidth = image->s();
int imageHeight = image->t();
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
//vertices->push_back(osg::Vec3(-0.5f, 0.0f, -0.5f));
// vertices->push_back(osg::Vec3(0.5f, 0.0f, -0.5f));
// vertices->push_back(osg::Vec3(0.5f, 0.0f, 0.5f));
// vertices->push_back(osg::Vec3(-0.5f, 0.0f, 0.5f));

 vertices->push_back(osg::Vec3(-imageWidth, 0.0f, -imageHeight));
 vertices->push_back(osg::Vec3(imageWidth, 0.0f, -imageHeight));
 vertices->push_back(osg::Vec3(imageWidth, 0.0f, imageHeight));
 vertices->push_back(osg::Vec3(-imageWidth, 0.0f, imageHeight));
 osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
 normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
 osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array;
 texcoords->push_back(osg::Vec2(0.0f, 0.0f));
 texcoords->push_back(osg::Vec2(1.0f, 0.0f));
 texcoords->push_back(osg::Vec2(1.0f, 1.0f));
 texcoords->push_back(osg::Vec2(0.0f, 1.0f));
 osg::ref_ptr<osg::Geometry> quad = new osg::Geometry;
 quad->setVertexArray(vertices.get());
 quad->setNormalArray(normals.get());
 quad->setNormalBinding(osg::Geometry::BIND_OVERALL);
 quad->setTexCoordArray(0, texcoords.get());
 quad->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));

 osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
 texture->setImage(image.get());
 texture->setTextureSize(imageWidth, imageHeight);
 //texture->setInternalFormat(GL_RGB16F_ARB);
 texture->setInternalFormat(GL_RGB16);
// texture->setSourceFormat(GL_RGB16);
// texture->setSourceType(GL_FLOAT);
 texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
 texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
 texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
 texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
 //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, data);
 //
 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 osg::ref_ptr<osg::Geode> root = new osg::Geode;
 root->addDrawable(quad.get());
 root->getOrCreateStateSet()->setTextureAttributeAndModes(
     0, texture.get());

osgViewer::Viewer viewer;
 viewer.setSceneData(root.get());
 return viewer.run();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【iOS逆向与安全】DTRpcClient 抓包和代码分析记录

frida-trace -UF -m "-[DTRpcConfig isAMRPC]"onEnter(log, args, state) {log(-[DTRpcConfig isAMRPC] ~~~~~);var customObj new ObjC.Object(args[0]); // 自定义对象// 打印该对象所有属性var ivarList customObj.$ivars;for (key in ivarList) {log(key${key…

【SpringBoot】| SpringBoot集成Dubbo

目录 一&#xff1a;SpringBoot集成Dubbo 1. 创建公共项目 2. 创建提供者项目provider 3. 创建消费者consumer项目 4. 注册中心Zookeeper的安装 图书推荐&#xff1a;《Python 自动化办公应用大全》 一&#xff1a;SpringBoot集成Dubbo 阿里巴巴提供了 dubbo 集成 spring…

原来,这就是现货黄金投资最大的悲哀

在现货黄金投资之中&#xff0c;最大的悲哀是什么呢&#xff1f;首先要知道的是现货黄金投资中最大的悲哀并不是亏损&#xff0c;比如投资者会问我都亏损了&#xff0c;为什么不是最大的悲&#xff1f;哎&#xff0c;不就是因为想进行现货黄金投资&#xff0c;就是想获利的吗&a…

北斗导航系统为渔船保驾护航,助力海洋渔业发展

在无垠的海洋中&#xff0c;渔船扮演着举足轻重的角色&#xff0c;为人们带来美味的海鲜。然而&#xff0c;每一次渔船出海都充满了未知和危险&#xff0c;船只的安全成为了渔民和国家关注的焦点。幸运的是&#xff0c;北斗导航系统作为一项顶级技术正在为渔船保驾护航&#xf…

肖sir___环境的讲解详情__002

一、环境讲解 1、jdk 什么是JDK&#xff1f;JDK的作用&#xff1f; JDK是java语言的软件开发工具包&#xff0c;能解释java程序&#xff0c;编译java语言&#xff0c;没有jdk的话无法编译Java程序。 包含了各种类库和工具&#xff0c;机器不是直接识别语言的&#xff0c;会借助…

零信任沙盒

零信任沙盒分析对比 互联网早期的沙盒&#xff08;sandbox&#xff09;又译为沙箱&#xff0c;意为在计算机安全领域中构建一种安全机制&#xff0c;为运行中的程序提供的隔离环境。通常用来测试一些来源不可信、具破坏力或无法判定的程序&#xff0c;特别是病毒木马类的程序。…

塔望食研院|千亿食用油市场拐点,量减价增,竞争加剧!

自2022年12月塔望咨询开设塔望食品大健康消费研究院&#xff08;简称塔望食研院&#xff09;栏目以来&#xff0c;塔望食研院以“为食品行业品牌高质量发展赋能”为理念&#xff0c;不断发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合消费调研数据、企业数据、第…

XC8233 电容式单按键触摸检测 IC 广泛应用于 TWS及 DC 应用上,实现产品智能化

目前市面上很多的小家电和消费类电子都已经改成触摸式的按键功能&#xff0c;而XC8233是一款电容式单按键触摸检测及接近感应控制芯片。采用 CMOS 工艺制造&#xff0c;内建稳压和去抖动电路&#xff0c;高可靠性&#xff0c;专为取代传统按键开关而设计。超低功耗与宽工作电压…

Java笔记:手写spring之简单实现springboot

手写spring之简单实现springboot 仓库地址: Raray-chuan/mini-spring 博文列表: 导读手写spring之ioc手写spring之aop手写spring之简单实现springboot 1.springmvc框架的理解 什么是MVC: MVC就是一个分层架构模式: MVC 设计模式一般指 MVC 框架&#xff0c;M&#xff08…

ALM物联网管理平台助力中台上云 数字化转型让展示更直观清晰

支持移动浏览、支持大屏显示等功能&#xff0c;能够为设备厂家提供数据依据&#xff0c;方便厂家的售后以及产品的维护、为运维等相关公司提供运维管理等相关功能。 ALM物联网云平台是基于以往的物联网产品&#xff0c;以及目前市场上的各种云平台优点&#xff0c;研精心打造的…

车联网安全集智联盟正式成立

2023年9月22日&#xff0c;在工业和信息化部网络安全管理局支持下&#xff0c;2023年世界智能网联汽车大会——“集智创新车联网安全新格局”特色专场在北京举行。工业和信息化部网络安全管理局领导出席并致辞&#xff0c;中国工程院邬江兴院士以及来自政产学研用等各方的领导和…

TLS/SSL(一)科普之加密、签名和SSL握手

一 背景知识 感悟&#xff1a; 不能高不成低不就备注&#xff1a; 以下内容没有逻辑排版,仅做记录 https基础面经 ① 加密方式 说明&#xff1a; 单向和双向认证遗留&#xff1a; 如何用openssl从私钥中提取公钥? ② 互联网数据安全可靠条件 说明&#xff1a; 二者相…

Java核心-你真的知道Object吗(Object:所有类的超类)

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 今天来聊一聊…

医院陪诊小程序源码 陪诊陪护小程序源码

医院陪诊小程序源码 陪诊陪护小程序源码 近年来&#xff0c;随着互联网技术的不断发展&#xff0c;我们的生活中出现了越来越多的智能设备和智能应用&#xff0c;这些智能应用不仅极大方便了我们的生活&#xff0c;还对现代医疗服务体验产生了深远的影响。本文将为大家介绍一种…

轻松搭建Linux的环境

Linux的环境的搭建 目录&#xff1a;一、使用云服务器二、使用虚拟机软件2.1 下载虚拟机软件2.2 下载一个操作系统的镜像文件 三、直接安装在物理机上四、使用XShell远程登录到Linux 目录&#xff1a; 我们平常用的都是windows系统&#xff0c;对Linux系统还是很陌生得。为什么…

【软件测试】资深测试聊,自动化测试分层实践,彻底打通高阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试的分层…

软件调研、研发、设计、管理、验收文档(全文档整理)

前言&#xff1a; 在软件开发生命周期中&#xff0c;调研、研发、设计、管理、验收等环节的文档编写至关重要。它们分别扮演着不同的角色&#xff0c;为项目的顺利进行和最终的成功提供支持和保障。 【获取方式在文末】 【在调研阶段】&#xff0c;文档的主要作用是记录和整…

Java环形链表(图文详解)

目录 一、判断链表中是否有环 &#xff08;1&#xff09;题目描述 &#xff08;2&#xff09;题解 二、环形链表的入环节点 &#xff08;1&#xff09;题目描述 &#xff08;2&#xff09;题解 一、判断链表中是否有环 &#xff08;1&#xff09;题目描述 给你一个链表的…

OCX 添加方法和事件 HTML调用ocx函数及回调 ocx又调用dll VS2017

ocx添加方法 类视图 最后面的XXXXXlib 右键 添加 添加方法。 其它默认 添加事件 类视图 最后面的XXXXX 右键 添加 添加事件。 这样编译就ocx可以了。 #include <iostream> #include <string> #include <comutil.h>CMFCActiveXControlSmartPosCtrl* …

Linux内核启动流程-第二阶段rest_init函数

一. Linux内核启动 上一篇文章简单了解了 Linux内核启动第二阶段&#xff0c;涉及的 start_kernel函数。start_kernel 函数最后调用了 rest_init 函数&#xff0c;接下来简单看一下 rest_init 函数。 本文续上一篇文章的学习&#xff0c;地址如下&#xff1a; Linux内核启…