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变绿 的相关文章

  • 3ds max文件导出osg或者ive格式

    osg osgEarth系列文章目录 文章目录 osg osgEarth系列文章目录 前言 参考 前言 首先下载插件osgexp Osgexp的下载地址 安装上之后 如果3ds max导出里面已经可以选择导出ive或者osg 恭喜你 如果没
  • 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传递数组到shader,(以qedl为例)

    一 对float类型的数组 osg ref ptrosg FloatArray m dampingPixelDist 赋值 void ccBilateralFilter updateDampingTable m dampingPixelDi
  • 第36.4节 动画-路径动画中的角度控制问题

    目录 本节功能 关键点 所有代码 本节功能 本节创建了一个高高低低的三维的路径 在楼顶和地面之间穿梭 一个飞机沿着这个路径进行飞行 如下图所示 请使用浏览器打开 平时遇到问题或加群也可以加我微信 13324598743 击此打开网盘资源链接
  • osgFBO(十)多pass-3,pass3,shader将背景从绿色变为蓝色

    pass3和pass2类似 只是再熟悉下 这个Pass设定为最后一步 可以不再输出纹理 即 1 pass3摄像机输入tex2 osg ref ptr
  • qedl中的fixDepth()简化

    如果将PerspectiveMode的设置为1 则会传递zNear和Zfar 在fixDepth 中 而将perspectiveMode 0 则大大简化fixDepth float fixDepth float depth return c
  • osg fbo(三),将颜色缓冲区图片通过shader变绿

    这个其实很简单 一 写顶点着色器和片元着色器 static const char vertexShader void main void n n gl Position ftransform n n static const char ps
  • VS2010+Qt5+OSG3.0开发环境搭建

    一 VS2010 VS2010的安装网上教程很多 不再叙述 二 Qt 在VS中开发程序 需要下载Qt安装包和Qt的VS插件 我用的版本是Qt5 1 1 for Windows VS2010 OpenGL VisualStudio Add i
  • 城市级海量数据流畅调度方案(初稿)

    城市级海量数据流畅调度方案 初稿 一 系统约束 1 硬件限制 CPU 显卡 内存 硬盘 最耗费CPU时间的是 视锥体和boundSphere boundBox的求交计算 显卡现在最大的瓶颈是 当渲染批次多时 2000个primitivese
  • qt5+osg多线程的解决方案

    问题描述 Cannot make QOpenGLContext current in a different thread 解决思路 在主线程中将qt窗体中的QOpenglContext moveToThread到窗体线程中 这样窗体线程在
  • 第36.1节 动画-刚体动画控制

    目录 本节功能 具体实现 存放动画 寻找动画 播放 暂停 复位 加速 减速 最后用一个事件响应来联接这一切 所有代码 本节功能 本节后几个章节会介绍和动画有关的课程 本节实现一个从3DMAX导出的地板破碎的动画的控制 这类动画叫做刚体动画
  • osgEarth的Rex引擎原理分析(一二七)rex影像层属性及其设置

    目标 一二六 中问题213
  • 调试最长的一帧(第21天)

    看看全流程 主要讲sceneview cull 跟过去 重点在cullstage 状态树与渲染树的构建都是在pushStateSet和popStateSet函数中完成的 而CullVisitor apply函数 在遍历节点时调用 则负责根据
  • osgEarth的Rex引擎原理分析(三十六)为什么要删除设置过的垂直水准面

    目标 二十九 中的问题86 椭球体 水平面 应该不是删除 而是信息创建出一个没有垂直水准面的Profile 待继续分析列表 9 earth文件中都有哪些options 九 中问题 10 如何根据earth文件options创建不同的地理信息
  • AABB和OBB包围盒简介

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

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

    在三维中常见的就是漫游整个场景 所谓漫游就是 观察者的视线从一个位置移动到另外一个位置或者在希望的方向上移动 在OSG中漫游可以通过改变观察者 相机 的位置和姿态来实现 三维世界中的模型的相对位置和形态不会发生变化 只是观察者的角度和位置发
  • osgEarth的Rex引擎原理分析(十四)分页瓦片加载器子节点的作用

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

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

随机推荐

  • 删除 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