osg fbo(三),将颜色缓冲区图片通过shader变绿

2023-10-31

这个其实很简单,
一,写顶点着色器和片元着色器

static const char * vertexShader =
{
“void main(void)\n”
“{\n”
" gl_Position = ftransform();\n"
“}\n”
};
static const char *psShader =
{
“uniform float alpha;”
“void main(void)\n”
“{\n”
“gl_FragColor =vec4(0.0f,1.0f,0.0f,alpha);\n”
“}\n”
};

二,通过stateset添加program,program添加shader
osg::ref_ptrosg::StateSet stateset = panelGeode->getOrCreateStateSet();

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);
stateset->setAttribute(program1, osg::StateAttribute::ON);
运行结果如下:

在这里插入图片描述

代码如下:

#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/CoordinateSystemNode>

#include <osg/Switch>
#include <osg/Types>
#include <osgText/Text>

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgGA/SphericalManipulator>

#include <osgGA/Device>
#include <osg/Shader>

osg::ref_ptrosg::Texture2D createFloatRectangleTexture(int width, int height)
{
osg::ref_ptrosg::Texture2D tex2D = new osg::Texture2D;
tex2D->setTextureSize(width, height);
tex2D->setInternalFormat(GL_RGBA16F_ARB);
tex2D->setSourceFormat(GL_RGBA);
tex2D->setSourceType(GL_FLOAT);
return tex2D.release();
}
osg::ref_ptrosg::Geode createTexturePanelGeode()
{
osg::ref_ptrosg::Vec3Array vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-1.0f, -1.0f, 0.0f));
vertices->push_back(osg::Vec3(1.0f, -1.0f, 0.0f));
vertices->push_back(osg::Vec3(1.0f, 1.0f, 0.0f));
vertices->push_back(osg::Vec3(-1.0f, 1.0f, 0.0f));

osg::ref_ptr<osg::Vec2Array> texCoord = new osg::Vec2Array;
texCoord->push_back(osg::Vec2(0.0, 0.0));
texCoord->push_back(osg::Vec2(1.0, 0.0));
texCoord->push_back(osg::Vec2(1.0, 1.0));
texCoord->push_back(osg::Vec2(0.0, 1.0));

osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
geom->setVertexArray(vertices);
geom->setTexCoordArray(0, texCoord);
geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));

osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(geom);
osg::ref_ptr<osg::StateSet> set1 = geode->getOrCreateStateSet();
set1->setMode(GL_LIGHTING, osg::StateAttribute::OFF); //设置不受光照影响,不然太暗了就看不清楚
return geode;

}

static const char * vertexShader =
{
“void main(void)\n”
“{\n”
" gl_Position = ftransform();\n"
“}\n”
};
static const char *psShader =
{
“uniform float alpha;”
“void main(void)\n”
“{\n”
“gl_FragColor =vec4(0.0f,1.0f,0.0f,alpha);\n”
“}\n”
};
int main()
{
osg::ref_ptrosgViewer::Viewer viewer = new osgViewer::Viewer;
//各个pass的根
osg::ref_ptrosg::Group passRoot = new osg::Group();
//场景根
osg::ref_ptrosg::Group sceneRoot = new osg::Group();
std::string strFileName = “D:/OpenSceneGraph-master/OpenSceneGraph-Data-master/cow.osg”;
osg::ref_ptrosg::Node node = osgDB::readNodeFile(strFileName);
sceneRoot->addChild(node);

//获取系统分辨率
unsigned int screenWidth, screenHeight;
osg::GraphicsContext::WindowingSystemInterface * wsInterface = osg::GraphicsContext::getWindowingSystemInterface();
if (!wsInterface)
{
	return -1;
}
wsInterface->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), screenWidth, screenHeight);
int texWidth = screenWidth;
int texHeight = screenHeight;
osg::ref_ptr<osg::Texture2D> tex = createFloatRectangleTexture(texWidth, texHeight);
//绑定pass1采样摄像机
osg::ref_ptr<osg::Camera> sampleCamera = new osg::Camera;
{
	sampleCamera->addChild(sceneRoot);
	sampleCamera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
	sampleCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); //这句话使内容不渲染到屏幕上
	sampleCamera->attach(osg::Camera::COLOR_BUFFER0, tex); //关联采样贴图
	sampleCamera->setViewport(0, 0, texWidth, texHeight);//摄像机视口投影到纹理大小

}
osg::ref_ptr<osg::Geode> panelGeode = createTexturePanelGeode();
osg::ref_ptr<osg::StateSet> stateset = panelGeode->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0, tex);

#if 1
osg::ref_ptrosg::Shader vs1 = new osg::Shader(osg::Shader::VERTEX, vertexShader);
osg::ref_ptrosg::Shader ps1 = new osg::Shader(osg::Shader::FRAGMENT, psShader);
osg::ref_ptrosg::Program program1 = new osg::Program;
program1->addShader(vs1);
program1->addShader(ps1);
stateset->setAttribute(program1, osg::StateAttribute::ON);
#endif
//final
osg::ref_ptrosg::Camera finalCamera = new osg::Camera;
{
finalCamera->addChild(panelGeode);
finalCamera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
}

passRoot->addChild(sampleCamera); //将摄像机加入场景
passRoot->addChild(finalCamera);
viewer->setSceneData(passRoot);
viewer->run();
return 0;

}

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

osg fbo(三),将颜色缓冲区图片通过shader变绿 的相关文章

  • 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
  • 调试最长的一帧(第19天)

    这个主要是理论了 抄一抄 最常用到场景管理方式时场景节点树结构 场景树顶点的叶节点osg Geode包含了各种需要渲染的几何体的顶点和渲染状态信息 而组节点osg Group及其派生出的各种特殊功能节点则作为场景树的各个枝节节点 它们也可以
  • WIN7 64位操作系统 编译64位OSG的方法

    1 在OSG官网上下载OSG源代码 本人下载的是OSG3 4 0 http www openscenegraph org index php download section stable releases 2 下载第三方包 http ww
  • 【OSG】OSG环境部署 OSG3.6.5+vs2017+win10_x64(超详细)

    最近开始了OSG的学习 开始搭建OSG开发环境 期间遇到了很多问题 也查阅了很多资料 最终搭建成功 OSG本来就是开源的 不应该敝帚自珍 应该多交流多分享 所以在此记录一下环境搭建的过程 方便以后查阅和交流 1 下载文件 1 1 OSG源码
  • osg fbo(一),生成颜色缓冲区图片

    由于工作需要 重新捡了下shader 很明显 fbo是重中之重 好记性不如烂笔头 先记录下 1 生成一个颜色纹理 为了省事 可以将纹理宽高 屏幕宽高 osg ref ptr
  • 第40节 指北针实例

    目录 本节内容 本节代码 思路 以下为全部代码 本节内容 受网友提问 本节实现一个指北针 上面左下角的指北针由两部分组成 一部分是指针 一部分是底盘 底盘动 指针在动 默认朝向Z轴负方向是北 朝向X轴正方向是东 你可以感受一下 其它的方向就
  • 使用Qt构建osgQt静态库在osg3.6.4中使用(附osgQt源码下载地址)

    osgQt库在osg3 4以后就给取消了 现在一般使用osgQOpenGL库替代 但是网上能搜到的教程里 常见的使用方法 还是以osgQt居多 因此 逼得我只能自己去编译一套osgQt的库文件 有如下几个注意点 首先是下载osgQt的地址
  • 调试最长的一帧(第17天)

    先看看流程 电子书上介绍了渲染器osgViewer Renderer类 osgViewer Renderer为摄像机渲染场景的工作提供了一个公共接口 当我们向视景器viewer添加了一个新的摄像机camera时 一个与摄像机相关联的渲染器R
  • osgearth消除近裁剪平面离物体太近时的裁剪问题

    This will mitigate near clip plane issues if you zoom in close to the ground LogarithmicDepthBuffer buf buf install view
  • 第38.1节 osg加载大tif-编译vpb

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

    目标 十七 中问题48 主要包含两个过程 1 已处理过请求的加载 这是真正意义上的加载 刚创建出来的请求是从缓存或文件没有关联影像 高程等数据的 需要经过多线程处理后才有数据 详见 十七 对于这些处理过的请求 在PagerLoader的更新
  • osgEarth获取显卡和硬件信息

    osgEarth Capabilities类负责获取显卡和硬件信息
  • osg报错:错误(活动) E0757 变量 “GLenum“ 不是类型名

    前言 osg报错 错误 活动 E0757 变量 GLenum 不是类型名 原因 osg中封装了openGL的库 感觉vs2019无法识别openGL相关的部分 解决 vs2019中配置 预处理器
  • 调试最长的一帧(第20天)

    电子书上给了个例子 抄一抄 加深下印象 也验证下以前的想法对不对 对于场景实例 其中 ss 加上数字代号来标识这些Stateset对象 后面括号中的两个参数分别表示setRenderBinDetails的两个设置项 表示空字串 R 表示 R
  • osg的ref_ptr和observer_ptr

    ref ptr就是所谓的强指针类型 observer ptr是所谓的弱指针类型 需要注意的是他们都是类 而不是指针 只不过他们用于管理指针 1 如何实现自动内存管理 所谓自动内存管理就是只管对象或指针的创建和使用而不管销毁 实现自动内存管理
  • osgEarth的Rex引擎原理分析(一二七)rex影像层属性及其设置

    目标 一二六 中问题213
  • osg+shader光照半透明

    先记录下 免得时间久了忘了 对于光照 光源有点光源 聚光灯 方向光 每种光源又有ambient diffuse specular emission几个属性 这里用点光源 不考虑衰减 1 diffuse是入射光与物体法线之间的余弦起作用 2
  • 调试最长的一帧(第十天)

    依照惯例 先看总体流程 到了更新回调 一边抄一边记忆 OSG更新回调的作用与事件回调有类似之处 由专门的访问器对象 updateVisitor负责场景图形更新遍历 所有的节点和Drawable几何体对象都可以使用setUpdateCallb
  • OSG学习:纹理映射(四)——三维纹理映射

    以下内容来自 1 OpenSceneGraph三维渲染引擎编程指南 肖鹏 刘更代 徐明亮 清华大学出版社 2 OpenSceneGraph三维渲染引擎设计与实践 王锐 钱学雷 清华大学出版社 3 自己的总结 下载完整工程OSG 12 Tex

随机推荐

  • 删除 Android Studio 的代理设置,让项目通过阿里云 maven jcenter 下载依赖资源

    如果你之前设置过 Android Studio 的 HTTP Proxy 然后又取消了代理设置 那么很有可能 Andoid Studio gradle 再次编译时仍然会走代理设置 造成依赖资源一直下载失败 1 删除 Android Stud
  • 用C语言计算1~20的阶乘之和

    昨天 2018 12 7 在做C语言的课后练习题的时候 有一道题要求我们计算1 20的阶乘之和 代码很快就写出来了 考虑到结果的值会比较大 而在Windows操作系统下 int 类型和 long 类型居然都是4个字节 C 中long类型是八
  • linux 下 java 单个class文件执行和多个class文件打包调用,执行

    银行项目 给个linux机器权限控制的比较厉害 之前有需求需要切割个日志文件 所以开始就写一个java文件 然后编译成class 直接运行 还算方便 后来需求越来越多 需要查询数据 需要操作excel 还因为字段处理等需要引入更多的累 打包
  • STL 之 List简析

    文章目录 前言 list介绍 list的节点 list的迭代器 SGI迭代器 VS下的迭代器的不同之处 list整体结构 list的成员方法 前言 记得我的一位老师说过 好的结构一定会有好的结果 C 的STL是数据结构与算法的集大成者 而其
  • C或C++文件操作大全

    文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 文件的读写操作 fgetc 从文件中读取一个字符 fputc 写一个字符到文件中去 fgets 从文件中读取一个字符串 fputs 写一个字符串到文件中去
  • 【面试八股文】每日一题:谈谈你对集合的理解

    每日一题 Java核心 谈谈你对集合的理解 面试八股文 谈谈你对集合的理解 Java集合是Java编程语言中用于存储数据的容器 它提供了一系列的类和接口 用于操作和管理数据集合 Java集合框架主要包括以下几个重要的接口和类 List Li
  • PPCA(Probability PCA)

    伯克利的机器学习课的note当中简要介绍了一下PPCA 但是我看了感觉没写什么东西 Yu姐上PPCA那节课我翘了 导致我对于PPCA几乎是一无所知 碰巧翻了一下工大自己的机器学习课的ppt 翻到了关于PPCA的内容 所以就结合CS189的n
  • 简单版扫雷游戏 温柔手把手教你实现 :>

    基本构思 1 菜单 创建一个简单的菜单来可供选择进行游戏或退出 2 扫雷游戏的创建 a 布局的构成 b 布置地雷 c 获取玩家的坐标 并扫出周围一圈的地雷个数 d 判断游戏的成败 完整代码在底下 1 菜单的创建 void menu prin
  • Candy

    Description There are N children standing in a line Each child is assigned a rating value You are giving candies to thes
  • 【蓝桥杯题解】

    顺子日期 小明特别喜欢顺子 顺子指的就是连续的三个数字 123 456 等 顺子日期指的就是在日期的 yyyymmdd 表示法中 存在任意连续的三位数是一个顺子的日期 例如 20220123 就是一个顺子日期 因为它出现了一个顺子 123
  • CentOS Linux的最佳替代方案(三)_银河麒麟Kylin Linux Advanced Server V10 SP2 for X86安装教程

    文章目录 CentOS Linux的最佳替代方案 三 银河麒麟Kylin Linux Advanced Server V10 SP2 for X86安装教程 1 银河麒麟Kylin Linux Advanced Server V10简介 1
  • python美元和人民币双向兑换程序_Python:程序练习题(二)

    Python 程序练习题 二 2 1温度转换程序 代码如下 t input 请输入带符号的温度值 如 32C if t 1 in C c f 1 8 float t 0 1 32 print 转换后的温度为 0fF f elif t 1 i
  • 【100天精通Python】Day46:Python网络编程_网络编程基础与入门

    目录 专栏导读 1 网络编程的基础 2 基本概念和协议 2 1 计算机网络基础 2 2 网络协议 IP地址 端口号 2 3 常见网络协议 3 套接字编程 3 1 套接字的基本概念 3 2 套接字的基本操作 3 3 套接字通信模型和方法 se
  • PHP phpoffice/phpspreadsheet导出excel

    PHP phpoffice phpspreadsheet导出excel 由于PHPExcel已经被废弃在PHP7 2中已经无法获取更新 官方重新开了一个新包phpspreadsheet 注意 这里使用的是tp6框架做测试 第一步 使用com
  • 新手帮助,STM32 刷入Arduino的BootLoader。实现免串口下载

    不少新人从某宝买回来十元一个的STM32C8T6的最小系统板 满网扒教程 最后搞一点点东西 也得把串口线拔来拔去 费事得很 上网上搜了一下 都说的比较笼统 故而 此篇是东拼西凑的 实在没工夫从头整理各种素材 借鉴 https www ard
  • 基于python大数据的电影可视化分析及电影推荐

    随着信息技术和互联网技术的快速发展 利用数据采集技术实现用户感兴趣的数据收集分析成为很多互联网公司研究讨论的热门话题 通过对基于Python的大数据的电影可视化分析与电影推荐 采集进行电影热度动态变化的需求进行调查分析 发现作为研究电影热度
  • 【模型训练】出现TypeError: unsupported operand type(s) for /: ‘NoneType‘ and ‘float‘

    在训练深度学习模型的过程中 出现报错 TypeError unsupported operand type s for NoneType and float 报错如下 libpng error Read Error Traceback mo
  • Qt之图形视图框架

    简述 图形视图架构 场景 视图 图元 图形视图框架中的类 图形视图坐标系 图元坐标 场景坐标 视图坐标 坐标映射 主要特点 缩放和旋转 打印 拖放 光标和tooltip 动画 OpenGL渲染 图元组 部件和布局 QGraphicsWidg
  • 通过手机号定位归属地

    工作中 很多地方 都存在只知道手机号 同时也想知道这个手机号的归属地的情况 本功能 即可实现这个要求 同时 可在此基础上做调整 实现其它功能 如制作一个属于自己的手机号段归属库等 实现思路 通过网上提供的免费查询接口 取得返回信息 并对返回
  • osg fbo(三),将颜色缓冲区图片通过shader变绿

    这个其实很简单 一 写顶点着色器和片元着色器 static const char vertexShader void main void n n gl Position ftransform n n static const char ps