osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fileName); image指针为空

2023-11-01

前言

使用《OpenSceneGraph Quick Start Guide》中文版及源码,里面的一个例子TextureMapping,在我本机上运行没有问题,但拷贝到公司电脑,发现总是运行异常,无法读取纹理图片,

在这里插入图片描述

调试到136行 image创建出来总是为空,纹理文件是有的,

#include "osgDB/ReadFile"
#include "osg/Geode"
#include "osg/Geometry"
#include "osg/StateSet"
#include "osg/StateAttribute"
#include "osg/Texture2D"
#include "osg/BlendColor"
#include "osg/AlphaFunc"
#include "osg/Notify"
#include "osg/BlendFunc"
#include "osgDB/WriteFile"
#include "osgDB/ReadFile"
#include "osgViewer/Viewer"
#include "osg/Texture1D"
#include "osg/Texture2D"
#include "osg/Texture3D"
#include "osg/Texture2DArray"


//Geometry->Drawable->Node->Object->Referenced
//AlphaFunc->StateAttribute->Object->Referenced
//StateAttributeCallback->Callback->Object->Referenced
//ClearNode->Group->Node->Object->Referenced
//CoordinateSystemNode->Group->Node->Object->Referenced
//Billboard->Geode->Group->Node->Object->Referenced
//Image->BufferData->Object->Referenced
//Texture1D/Texture2D/Texture2DArray/Texture3D->Texture->TextureAttribute->StateAttribute->Object->Referenced

osg::ref_ptr<osg::Node> createGeode()
{
	osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
    v->push_back(osg::Vec3(0.f, 0.f, 0.f)); // 0
    v->push_back(osg::Vec3(0.f, 0.f, 4.f));
    v->push_back(osg::Vec3(-1.f, 0.f, 0.f));
    v->push_back(osg::Vec3(1.f, 0.f, 0.f)); //3
    v->push_back(osg::Vec3(1.f, 0.f, 4.f));
    v->push_back(osg::Vec3(-1.f, 0.f, 4.f));
    v->push_back(osg::Vec3(0.f, -1.f, 0.f)); //6
    v->push_back(osg::Vec3(0.f, 1.f, 0.f));
    v->push_back(osg::Vec3(0.f, 1.f, 4.f));
    v->push_back(osg::Vec3(0.f, -1.f, 4.f)); //9

    osg::ref_ptr<osg::Vec2Array> tc = new osg::Vec2Array;
    tc->push_back(osg::Vec2(.5f, 0.f));
    tc->push_back(osg::Vec2(.5f, 1.f));
    tc->push_back(osg::Vec2(0.f, 0.f));
    tc->push_back(osg::Vec2(1.f, 0.f));
    tc->push_back(osg::Vec2(1.f, 1.f));
    tc->push_back(osg::Vec2(0.f, 1.f));
    tc->push_back(osg::Vec2(0.f, 0.f));
    tc->push_back(osg::Vec2(1.f, 0.f));
    tc->push_back(osg::Vec2(1.f, 1.f));
    tc->push_back(osg::Vec2(0.f, 1.f));

    osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
    c->push_back(osg::Vec4(1.f, 1.f, 1.f, 1.f));

    osg::ref_ptr<osg::Group> grp = new osg::Group;
    {
        osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
        geom->setVertexArray(v.get());
        geom->setTexCoordArray(0, tc.get());
        geom->setColorArray(c.get());
        geom->setColorBinding(osg::Geometry::BIND_OVERALL);

        // -X panal
        GLushort indices[] = { 2, 0, 1, 5 };
        geom->addPrimitiveSet(new osg::DrawElementsUShort(osg::PrimitiveSet::QUADS, 4, indices));

        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable(geom.get());
        grp->addChild(geode.get());
    }
    {
        osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
        geom->setVertexArray(v.get());
        geom->setTexCoordArray(0, tc.get());
        geom->setColorArray(c.get());
        geom->setColorBinding(osg::Geometry::BIND_OVERALL);

        // +X panal
        GLushort indices[] = { 2, 3, 4, 5 };
        geom->addPrimitiveSet(new osg::DrawElementsUShort(osg::PrimitiveSet::QUADS, 4, indices));
        
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable(geom.get());
        grp->addChild(geode);
        //grp->addChild(geode.get());
    }
    {
        osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
        geom->setVertexArray(v.get());
        geom->setTexCoordArray(0, tc.get());
        geom->setColorArray(c.get());
        geom->setColorBinding(osg::Geometry::BIND_OVERALL);

        GLushort indices[] = { 6, 0, 1, 9 };
        geom->addPrimitiveSet(new osg::DrawElementsUShort(osg::PrimitiveSet::QUADS, 4, indices));

        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable(geom.get());
        grp->addChild(geode.get());
    }

    {
        osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
        geom->setVertexArray(v.get());
        geom->setTexCoordArray(0, tc.get());
        geom->setColorArray(c.get());
        geom->setColorBinding(osg::Geometry::BIND_OVERALL);

        GLushort indices[] = { 0, 7, 8, 1 };
        geom->addPrimitiveSet(new osg::DrawElementsUShort(osg::PrimitiveSet::QUADS, 4, indices));

        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable(geom.get());
        grp->addChild(geode.get());
    }

    return grp.release();
}

osg::ref_ptr <osg::Node> createSceneGraph()
{
    //osg::ref_ptr<osg::Node> node = new osg::Node;
    osg::ref_ptr<osg::Node> node = createGeode();

    //osg::ref_ptr<osg::StateSet> state = new osg::StateSet;
    osg::ref_ptr<osg::StateSet> state = node->getOrCreateStateSet();
    state->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED);
    state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);

    // Load the texture image
    //   Image courtesy Virtual Terrain Project (http://vterrain.org/)
    std::string fileName("Picea_pungens__blue_spruce15_256.png");
    osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fileName);
    if (!image.valid())
    {
        osg::notify(osg::FATAL) << "Unable to load data file. Exiting." << std::endl;
        return (NULL);
    }

    // Set the image in a Texture2D object
    osg::ref_ptr<osg::Texture2D> tex = new osg::Texture2D;
    tex->setImage(image.get());

    // After creating the OpenGL texture object, release the
    //   internal ref_ptr<Image> (to delete the Image).
    tex->setUnRefImageDataAfterApply(true);
    state->setTextureAttributeAndModes(0, tex.get());

    // Turn on blending
    //osg::BlendFunc* bf = new osg::BlendFunc;
    osg::ref_ptr<osg::BlendFunc> bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA);   //有参数不需要括号构造函数
    state->setAttributeAndModes(bf);

    // Turn on alpha testing
    osg::ref_ptr<osg::AlphaFunc> af = new osg::AlphaFunc(osg::AlphaFunc::GREATER, 0.05f);
    state->setAttributeAndModes(af);


    return (node.release());
}

int main(int argc, char** argv)
{
    //osg::ref_ptr<osg::Node> root = new osg::Node;
    osg::ref_ptr<osg::Node> root = createSceneGraph();
    if (!root.valid())
    {
        //std::cout << 
        osg::notify(osg::FATAL) << "Failed in createSceneGraph()." << std::endl;
        return (1);
    }

    std::string out("TextureMapping.osg");
    if (!(osgDB::writeNodeFile(*(root.get()), out)))
    {
        osg::notify(osg::FATAL) << "Failed in osgDB::writeNodeFile()." << std::endl;
        return (1);     
    }

    osg::notify(osg::ALWAYS) << "Successfully wrote \"" << out << "\". Execute \"osgviewer " << out << "\" to view." << std::endl;

	
    osgViewer::Viewer viewer;
    viewer.setSceneData(osgDB::readNodeFile("TextureMapping.osg"));
    return viewer.run();
    
    
    return 0;
}

解决

没有配置环境变量,根据自己机器实际路径添加,我的机器路径如下
1.在系统环境变量中加入:
(1)OSG_FILE_PATH
(2)OSG_NOTIFY_LEVEL
在这里插入图片描述

2.在path中加入
(1)E:\osg\OpenSceneGraph_build_vs2019_x64\bin
(2)E:\osg\3rdParty\3rdParty_x64\x64\lib
(3)E:\osg\3rdParty\3rdParty_x64\x64\bin
在这里插入图片描述

工程源码下载

源码工程下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fileName); image指针为空 的相关文章

  • osg--读写

    文件I O 命名规则 osgdb xxx 比如 osgdb osg osgdb jpeg 关联文件后缀和加载器 osgDB Registry instance gt addFileExtensionAlias jpeg jpeg osgDB
  • osg--提高效率

    多线程 OpenThreads Thread 虚函数 cancel run OpenThreads Mutex OpenThreads Barrier OpenThreads Condition 线程管理 GetNumberOfProces
  • Array王锐大神力作:osg与PhysX结合系列内容——第3节 地形碰撞体

    Array王锐大神力作 osg与PhysX结合系列内容 地形碰撞体 烘焙 物理碰撞体 HeightField与TriangleMesh 物理材质的概念与使用 直接读取高度图数据 与osg HeightField结合使用 Pvd调试环境 构建
  • osgexp安装与使用

    osg系列文章目录 文章目录 osg系列文章目录 前言 一 下载osgexp和3d max 二 osgexp安装 三 编译OSGExp 参考 前言 3ds max文件导出osg或者ive格式 一 下载osgexp和3d max 1 首先下载
  • osg fbo(一),生成颜色缓冲区图片

    由于工作需要 重新捡了下shader 很明显 fbo是重中之重 好记性不如烂笔头 先记录下 1 生成一个颜色纹理 为了省事 可以将纹理宽高 屏幕宽高 osg ref ptr
  • SingleThreaded是如何进入cull_draw()的?

    正如以前所说 单线程模式是通过cull draw 进行剔除绘制的 如何进入的呢 其实很简单 逆推下 最后 回到梦开始的地方
  • osgcuda

    osgcuda 转 原文 http blog sina com cn s blog df1b276a0101inbi html osgCompute是对代码的并行流处理器执行的抽象基库 库连接到OSG的 OSG 因此它可以被包括在场景图 它
  • 第38.1节 osg加载大tif-编译vpb

    目录 本节内容 具体内容 本节内容 本节开始实现使用osg加载超大tif的功能 具体有多大的tif可以支持呢 就是要多大有多大 要不是网友们提这个功能 我基本上已经忘记vpb了 它是osg早期关于使用影像和高程大图来生成瓦片地形的这么一个工
  • osgEarth的Rex引擎原理分析(三十三)分页瓦片卸载器子节点的作用

    目标 十二 中的问题22 分页瓦片卸载器是在Rex引擎的setMap函数中创建的 创建之初就关联了活跃瓦片寄存器和资源释放器 作用见下面分析 osgEarthDrivers engine rex RexTerrainEngineNode c
  • OpenSceneGraph-OpenSceneGraph-3.6.5源码编译

    前言 准备 git 不是必须 使用git得到的源码是3 6 5版本的 CMake vs2019 VS017可以 我这里用的vs2019 osg主页 源码下载 Cmake编译源码 编译报错 CMake Warning dev at F Pro
  • ViewerBase::renderingTraversals()的简易理解

    前两篇说到了camera用来剔除 context用来渲染 多线程渲染就是把cpu尽可能的分配给context 如果土豪的话 在剔除过程也分配cpu 另外 也要注意到过期请求数据不处理 当然 首先要获取场景 摄像机和上下文 现在看下摄像机剔除
  • osg报错:错误(活动) E0757 变量 “GLenum“ 不是类型名

    前言 osg报错 错误 活动 E0757 变量 GLenum 不是类型名 原因 osg中封装了openGL的库 感觉vs2019无法识别openGL相关的部分 解决 vs2019中配置 预处理器
  • osgEarth的Rex引擎原理分析(五十二)CGCS2000与WGS84坐标系的比较

    目标 四十六 中的119 文章 2000中国大地坐标系及其与WGS84的比较 对此有详细的比较 https max book118 com html 2017 0614 114928909 shtm 结论是 实现上相容的 仅在扁率上有微小差
  • osgEarth的Rex引擎原理分析(一二七)rex影像层属性及其设置

    目标 一二六 中问题213
  • AABB和OBB包围盒简介

    一 AABB立方体边界框检测 用球体去近似地代表物体运算量很小 但在游戏中的大多数物体是方的或者长条形的 应该用方盒来代表物体 另一种常见的检测模型是立方体边界框 如图10 31展示了一个AABB检测盒和它里面的物体 坐标轴平行 Axial
  • OSG学习:纹理映射(四)——三维纹理映射

    以下内容来自 1 OpenSceneGraph三维渲染引擎编程指南 肖鹏 刘更代 徐明亮 清华大学出版社 2 OpenSceneGraph三维渲染引擎设计与实践 王锐 钱学雷 清华大学出版社 3 自己的总结 下载完整工程OSG 12 Tex
  • osgEarth的Rex引擎原理分析(二)osg是如何根据文件扩展名寻找需要加载的动态链接库插件的

    在 一 中有createLibraryNameForFile 它会根据文件扩展名构造需要加载的动态链接库 osgDB Registry cpp ReaderWriter ReadResult Registry read const Read
  • osgEarth的Rex引擎原理分析(十四)分页瓦片加载器子节点的作用

    目标 十二 中的问题21 在rex引擎的setMap中创建了分页瓦片加载器子节点 osgEarthDrivers engine rex RexTerrainEngineNode cpp void RexTerrainEngineNode s
  • OSG中几何体的绘制(二)

    5 几何体操作 在本章的前言中就讲到 场景都是由基本的绘图基元构成的 基本的绘图基元构成简单的几何体 简单的几何体构成复杂的几何体 复杂的几何体最终构造成复杂的场景 当多个几何体组合时 可能存在多种降低场景渲染效率的原因 在很多3D引擎中
  • OSG中几何体的绘制(一)

    本章主要介绍一些几何体的绘制方法 绘制几何体在场景中是非常常见的 也是最基本的 在很多应用程序中可以看到相当复杂的场景 但不管场景有多复杂 它们都是由少数几个基本的图形元素构建而成的 只要想想达芬奇那些伟大的作品也是由铅笔和画刷所完成的 读

随机推荐

  • L1-8 乘法口诀数列

    本题要求你从任意给定的两个 1 位数字 a1 和 a2 开始 用乘法口诀生成一个数列 an 规则为从 a1 开始顺次进行 每次将当前数字与后面一个数字相乘 将结果贴在数列末尾 如果结果不是 1 位数 则其每一位都应成为数列的一项 输入格式
  • ad电阻原理图_光敏电阻的基础知识介绍

    39G电子技术 电路 电子元件等 全套资料免费领 干货下载 十天学会单片机完整版 100个实例 PPT 点击上方红字 即可获取 一 光敏电阻 光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器 表面还涂有防潮树脂 具有光电导效应 二 特
  • TCP 拥塞窗口原理

    学过网络相关课程的 都知道TCP中 有两个窗口 滑动窗口 在我们的上一篇文章中有讲 接收方通过通告发送方自己的可以接受缓冲区大小 这个字段越大说明网络吞吐量越高 从而控制发送方的发送速度 拥塞窗口 也就是本文要讲的 概念 一个连接的TCP双
  • element-plus elplus el-tree三种图标自定义 并且点击图标展开收起 点击文字获取数据

    前言 公司需求 需要实现如下样式的树形列表 基于vue3 element plus 当节点展开时 显示展开的文件夹图标 当节点收起时显示收起的文件夹 最后一级显示文件样式 废话没有了 代码如下
  • C规范编辑笔记(九)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 正文 今天我们来分享一下C规范编辑笔记第九篇 话不多说 我们直接来看
  • 树莓派数据远程传输学习记录——TCP/IP协议连接OneNet云平台传输数据的方法

    目录 项目场景 问题描述 解决方案 OneNet云平台前期项目搭建准备 以网络调试助手模拟树莓派建立连接并发送数据 树莓派与OneNet云平台进行对接 最后总结 项目场景 本人在进行树莓派项目开发时进行数据远程传输 4G WiFi通信 过程
  • Spark 3.0.3 源码阅读及 idea 调试环境搭建

    目录 1 源码下载 2 源码解压并编译 3 使用 Idea 打开或导入 4 idea 调试环境设置 Master 设置 Worker 设置 1 源码下载 Downloads Apache Spark 2 源码解压并编译 编译前建议在环境变量
  • ingress 400 Bad Request The plain HTTP request was sent to HTTPS port

    问题现象 访问时返回400 Bad Request 并提示The plain HTTP request was sent to HTTPS port 问题原因 Ingress Controller到后端Pod请求使用了默认的HTTP请求 但
  • 效果:网页页面随机改变颜色+自定义样式背景颜色随机改变+20秒倒计时+时间一到马上跳转新页面

  • linux 安装flash

    2 將下载好的包拷到某个目录下并解压得到文件 得到如下libflashplayer so文件与usr文件夹 3 将libflashplayer so拷到firefox的插件目录 usr lib mozilla plugin 下 sudo c
  • 个人总结-基础算法

    文章目录 基础算法 各个算法的复杂度及稳定性等 冒泡排序 蛮力法 理解 函数代码 测试用例 选择排序 蛮力法 理解 函数代码 测试用例 归并排序 分治法 理解 函数代码 测试用例 快速排序 分治法 理解 函数代码 测试用例 插入排序 减治法
  • GitHub、GIT、Intellij集成github初探

    一 什么是Git 刚接触Git或github的童鞋可能会把它们的概念搞混淆 所以在这里稍微解释一下 Git和github是两个完全不同的概念 Git是一个版本管理系统 Version Control System 简称 VCS 早期版本管理
  • kafka-offset手动提交和自动提交

    目录 首先回顾之前的知识点 自动提交offset 手动提交 消费者poll消息的细节 完整代码 按照新方法进行消费消息 1 指定时间进行消息的消费 2 指定分区开始从头消费 指定分区的偏移量开始消费 新消费组的消费offset规则 首先回顾
  • 国内如何申请到Twitter API

    Tip Twitter Developer Platform 申请只能申请一次 被拒后该账户就不能再申请了 一点要做好详细的准备再提交申请 网上的申请教程有的很坑 几句话就提交申请通过了 几率很小 Twitter开发者平台的申请 记录三次申
  • vue+element文本域设置自适应和默认高度

  • ⛳ TCP 协议面试题

    目录 TCP 协议面试题 一 为什么关闭连接的需要四次挥 建 连接却只要三次握 呢 二 为什么连接建 的时候是三次握 可以改成两次握 吗 三 为什么主动断开 在TIME WAIT状态必须等待2MSL的时间 四 如果已经建 了连接 但是Cli
  • PyTorch 官方教程:撸一个神经网络

    本文为 PyTorch 官方教程中 如何构建神经网络 基于 PyTorch 专门构建神经网络的子模块 torch nn 构建一个简单的神经网络 完整教程运行 codelab torch nn 文档 神经网络由对数据执行操作的层 模块组成 t
  • PaddleDetection重磅升级!PP-YOLOE、PP-PicoDet云边端一网打尽!

    目标检测作为计算机视觉领域的顶梁柱 不仅可以独立完成车辆 商品 缺陷检测等任务 也是人脸识别 视频分析 以图搜图等复合技术的核心模块 在自动驾驶 工业视觉 安防交通等领域的商业价值有目共睹 正因如此 YOLOv5 YOLOX PP YOLO
  • 从Java到Go:构建一个任务调度器和队列管理系统

    目录 1 任务调度器和队列管理的基本概念 2 Java和Go的基本差异 2 1 语法差异
  • osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fileName); image指针为空

    前言 使用 OpenSceneGraph Quick Start Guide 中文版及源码 里面的一个例子TextureMapping 在我本机上运行没有问题 但拷贝到公司电脑 发现总是运行异常 无法读取纹理图片 调试到136行 image