osg中使用OpenGL绘制

osg绘制点线面 绘制一个贴地形的区域,地形起伏处可以看到面填充与地面贴合(示例在北京范围):主要起作用的Symbol是 osgEarth::AltitudeSymbol,它的osgEarth::AltitudeSymbol::CLAMP_TO_TERRAIN属性。属性,否则默认是闭合的线。建议自行建立工程后,编译源码后进行测试(内含main.cpp),随时修改以及时看到变化情况,了解各个参数对绘制的影响。(相比上面的2D图元绘制的代码,3D图元绘制的资源内,封装了对绘制属性的设置修改,即封装成类,提供到接口操作) 阅读详情

在osg开发的时候,想要绘制一些图形,但是在osg中也没有找到合适的方法(估计是我太菜了),然后就想到用OpenGL的方法进行绘制,尝试了一些,记录一下可以行的通的。

绘制一条动态变化的直线

class CreateRay : public osg::Geometry
{
public:
	CreateRay(osg::ref_ptr<osg::GraphicsContext> gc);
	~CreateRay() {};
private:
	osg::ref_ptr<osg::Vec4Array> _varr;   //vertex buffer
	osg::ref_ptr<osg::Uniform> MVPMatrix;
	osg::ref_ptr<osg::GraphicsContext> _gc;
private:
	virtual void drawImplementation(osg::RenderInfo & renderInfo) const;
private:
	GLuint m_glControllerVertBuffer;
	GLuint m_unControllerVAO;
};

CreateRay::CreateRay(osg::ref_ptr<osg::GraphicsContext> gc):_gc(gc)
{
	setUseVertexBufferObjects(true);
	_varr = new osg::Vec4Array;

	osg::Vec4 strat = osg::Vec4(0, 0, 0, 1);
	osg::Vec4 end = osg::Vec4(10, 0, 0, 1);

	_varr->push_back(strat);
	_varr->push_back(end);
	_varr->setBufferObject(new osg::VertexBufferObject);

	osg::ref_ptr<osg::Program> vertexProg = new osg::Program;
	osg::ref_ptr<osg::Shader> verShader = new osg::Shader(osg::Shader::VERTEX);
	osg::ref_ptr<osg::Shader> fragment = new osg::Shader(osg::Shader::FRAGMENT);
	verShader->loadShaderSourceFromFile("rayvertex.vs");
	fragment->loadShaderSourceFromFile("rayfrag.fg");
	vertexProg->addShader(verShader);
	vertexProg->addShader(fragment);
	this->getOrCreateStateSet()->setAttributeAndModes(vertexProg.get(), osg::StateAttribute::ON);

	this->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
	this->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
	this->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
	this->getOrCreateStateSet()->setRenderBinDetails(50, "RenderBin");
	
	std::vector<float> vertdataarray;
	{
		osg::Vec4 start = osg::Vec4(0, 0, 0, 1);
		osg::Vec4 end = osg::Vec4(10, 0, 0, 1);
		vertdataarray.push_back(start.x()); vertdataarray.push_back(start.y()); vertdataarray.push_back(start.z()); vertdataarray.push_back(start.w());
		vertdataarray.push_back(end.x()); vertdataarray.push_back(end.y()); vertdataarray.push_back(end.z()); vertdataarray.push_back(end.w());

		osg::GLExtensions* ext = _gc->getState()->get<osg::GLExtensions>();

		ext->glGenVertexArrays(1, &m_unControllerVAO);
		ext->glBindVertexArray(m_unControllerVAO);

		ext->glGenBuffers(1, &m_glControllerVertBuffer);
		ext->glBindBuffer(GL_ARRAY_BUFFER_ARB, m_glControllerVertBuffer);
		ext->glBufferData(GL_ARRAY_BUFFER_ARB, sizeof(float) * vertdataarray.size(), &vertdataarray[0], GL_STREAM_DRAW);
		GLuint stride = 4 * sizeof(float);
		ext->glEnableVertexAttribArray(0);
		ext->glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, stride, (GLvoid *)0);
		ext->glBindBuffer(GL_ARRAY_BUFFER_ARB, 0);

		ext->glBindVertexArray(0);

		//ext->glBindBuffer(GL_ARRAY_BUFFER_ARB, m_glControllerVertBuffer);
		//ext->glBufferData(GL_ARRAY_BUFFER_ARB, sizeof(float) * vertdataarray.size(), &vertdataarray[0], GL_STREAM_DRAW);
	}
}

int main()
{
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; 
	osg::ref_ptr<osg::Group> gp = new osg::Group;

	osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
	if (!wsi)
		return 0;
	osg::GraphicsContext::ScreenIdentifier si;
	si.readDISPLAY();
	if (si.displayNum < 0)
		si.displayNum = 0;
	if (si.screenNum < 0)
		si.screenNum = 0;
	unsigned int width, height;
	wsi->getScreenResolution(si, width, height);
	osg::GraphicsContext::Traits* traits = new osg::GraphicsContext::Traits;
	traits->hostName = "";// si.hostName;
	traits->screenNum = 0;
	traits->displayNum = 0;
	traits->windowDecoration = true;
	traits->x = 200;
	traits->y = 200;
	traits->width = width - traits->x;
	traits->height = height - traits->y;
	traits->doubleBuffer = true;
	traits->sharedContext = nullptr;

	osg::ref_ptr<osg::GraphicsContext> gc;
	gc = osg::GraphicsContext::createGraphicsContext(traits);
	if (gc.valid())
	{
		gc->setClearColor(osg::Vec4(0, 0, 0, 1.0));
		gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	}
	viewer->getCamera()->setGraphicsContext(gc);
	viewer->getCamera()->setViewport(0, 0, traits->width, traits->height);

	viewer->realize();
	viewer->getCamera()->getGraphicsContext()->makeCurrent();//osg不在绘制阶段时需要建立一个有效的gc供OpenGL函数使用
	viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);//需要单线程
	gc->getState()->setUseModelViewAndProjectionUniforms(true);

	osg::ref_ptr<CreateRay> ray = new CreateRay(gc);
	gp->addChild(ray);
	
	gp->addChild(osgDB::readNodeFile("cow.osg"));
	viewer->setSceneData(gp);
	viewer->getCamera()->setClearColor(osg::Vec4(0, 0, 0, 1.0));
	viewer->addEventHandler(new osgViewer::StatsHandler);
	viewer->addEventHandler(new osgViewer::WindowSizeHandler);
	return viewer->run();
}

 

OSG中嵌入一个opengl代码(且opengl图形能动态更新) OSG中嵌入一个opengl代码(且opengl图形能动态更新) (1)继承osg::Drawable::DrawCallback,在 drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable)函数里添加opengl代码。 (2)Drawable设置绘制回调函数,并注意要把显示列表设置为false 阅读详情

相关推荐

OSGEarth绘制随模型位置变化而动态移动的线段

目录 一、编写Callback 二、初始化并绑定Callback 本文主要介绍在OSGEarth中绘制随模型位置变化而动态移动的线段,即两个三维模型通过线段进行连接,在模型移动的过程中,连接的线段跟着模型做相应的位移。 一、编写Callback #pragma once class UpdateLink :public osg::NodeCallback { public: osg:...

cchangcs 4338

【osg】OSG开发(04)—创建多个场景视图

在osg中,有时候需要使用到多个场景视图,每一个场景视图中有不一样的操作:例如:漫游器、照相机、粒子效果、多个模型组合等。在OSG中,提供了类来实现这个需求。 (2-1)首先读取一个模型文件: (2-2)创建一个osgViewer::CompositeViewer实例: (2-3)创建一个osg::GraphicsContext::WindowingSystemInterface来获取窗口系统的信息,这里主要获取:主窗口id、长、宽等信息: (2-4)使用osg::GraphicsContext::Trai

iriczhao的博客 1742

OSG三维渲染引擎编程学习之三十六:“第四章:OSG几何体绘制” 之 “4.1 OSG基础绘图类”

OSG三维渲染引擎编程学习;第四章:OSG几何体绘制”;4.1 OSG基础绘图类

LuckyHanMo的博客 1070

动态直线绘制的实现

欢迎使用Markdown编辑器写博客本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用

qq_33337277的博客 965

osg画实时曲线的代码,vc开发

本例子提供头文件和源文件,里面是osg画实时曲线的代码

远程桌面连接失败?手把手教你解决CredSSP加密Oracle漏洞(Win10/Win11通用)

本文详细解析了Windows远程桌面连接因CredSSP加密Oracle漏洞安全更新导致的“身份验证错误”问题。文章从原理入手,提供了通过组策略编辑器(适用于专业版)和注册表编辑器(适用于家庭版)两种核心解决方案,指导用户将安全策略调整为推荐的“缓解”模式,以在保障安全的前提下恢复连接,并给出了高级脚本处理与安全最佳实践。

u6v7w8x的博客 724

OSG使用OpenGL(以及glad库)绘制自定义图形

简单记录一下在OSG中使用OpenGL函数(以及glad库)绘制自定义图形

qq_45523399的博客 2360

VNC Viewer建立多个图形界面,来远程访问同一个服务器(Ubuntu)

如题。目前已经有了一个VNC viewer连接,那么如果再开一个图形界面呢? 思路主要是:新建一个用户,从这个用户新建一个vnc连接,然后访问图形界面。

the Blog of 等不到天亮丶等时光 5901

OSG与OPENGL分别绘制同一个应用的两个窗口的问题

同一个应用有两个窗口分别用OSG与OPENGL绘制,使用的窗口空间都是QGLWidget。 1) 绘制OPENGL窗口;2)开启OSG窗口,绘制一次;3)然后回到OPENGL窗口绘制图形。4)销毁OSG窗口。 这时OPENGL窗口的绘制状态受到了OSG窗口的影响。 反复测试,找不到原因。如果销毁窗口的时候,释放OSG创建的Context,可解决这个问题。 猜测是OSG窗口的OPENGL的g

lemon的空间 1565

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2976

信息抽取实战:三元组抽取(限定领域 vs 开放领域)(附代码)

信息抽取实战:三元组抽取 目录信息抽取实战:三元组抽取一、限定领域的三元组抽取比赛介绍数据分析序列标注模型关系分类模型三元组提取总结开放领域的三元组抽取标注平台文本分类新数据进行三元组抽取总结参考文献 一、限定领域的三元组抽取   本项目将会介绍在2019语言与智能技术竞赛的三元组抽取比赛方面的一次尝试。由于该比赛早已结束,当时也没有参加这个比赛,因此没有测评成绩,我们也只能拿到训练集和验证集。但是,这并不耽误我们在这方面做实验。 比赛介绍   该比赛的网址为:http://lic2019.ccf.org.

南有芙蕖 2万+

OSG 绘制Geometry使用

OSG的几何绘制 osg 绘制使用的OpenGL的绘制过程 1. OSG绘制简单线 使用简单线绘制,使用OpenGL的绘制的线的能力过程 // create Geometry object to store all the vertices and lines primitive. osg::Geometry* linesGeom = new osg::Geometry(); //创...

Rsoftwaretest的专栏 6934

工业视觉开发者的福音:用C#玩转VisionMaster算子(非方案版完整教程)

本文为工业视觉开发者提供了一份完整的C#与VisionMaster算子二次开发教程,详细介绍了环境配置、算子调用原理、性能优化技巧及实战案例。通过模板匹配和二维码识别等实例,展示了如何高效集成VisionMaster算子到现有框架中,提升工业自动化视觉检测系统的灵活性和性能。

weixin_29280657的博客 271

【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、OpenSceneGraph / OSG)第七期

OpenSceneGraph是一个开源的三维引擎,被广泛的应用在可视化仿真、游戏、虚拟现实、科学计算、三维重建、地理信息、太空探索、石油矿产等领域。OSG采用标准C++和OpenGL编写而成,可运行在所有的Windows平台、OSX、GNU/Linux、IRIX、Solaris、HP-Ux、AIX、Android和FreeBSD 操作系统。OSG是有版权的开源引擎,基于LGPL,OSG也生成了自己的许可(OSGPL)。(1)快速开发。

爱看书的小沐 3598

STM32F4三重ADC+DMA双缓冲实战:用CubeMX搞定同步采样,告别数据覆盖烦恼

本文详细介绍了STM32F4三重ADC与DMA双缓冲技术的实战应用,通过CubeMX配置实现同步采样,解决数据覆盖问题。内容涵盖硬件架构解析、CubeMX工程配置、双缓冲实现技巧及调试优化方法,适用于电机控制、电力监测等需要高精度多通道信号采集的场景。

weixin_30627341的博客 357

FPGA实战:手把手教你配置4个Aurora 8B/10B IP核共享时钟(附完整工程文件)

本文详细介绍了在Xilinx FPGA上配置四个Aurora 8B/10B IP核并实现时钟共享的实战指南。从工程规划、IP核基础配置到共享逻辑的实现,再到多核时钟域与复位架构的设计,以及时序约束与调试技巧,提供了完整的解决方案和可复用的工程文件。特别强调了GT参考时钟的共享和复位信号的处理,帮助工程师高效解决多通道高速串行通信的设计挑战。

weixin_30879169的博客 411

osg绘制立体几何

根据网友的代码,实现了,然后自己画出来立方体什么的,发现并不难。。。加入顶点坐标然后根据坐标数组进行绘制 一、openGL中,定义了10种图元:GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, GL_...

Jeacean的博客 1819

抖音 X-Gorgon 加密算法逆向与 Python 爬虫实战(2026 最新版)

抖音(TikTok 国内版)作为日活超 8 亿的超级 App,其反爬体系在国内互联网中属于顶级难度。核心签名参数X-Gorgon和X-Khronos是几乎所有业务接口(视频详情、评论、搜索、用户主页)的“通行证”。没有正确的 Gorgon 签名,服务器直接返回403或。市面上的教程大多停留在2023 年之前的 V4 版本,而抖音在 2025 年底全面升级到了V6 协议,算法结构、加密常数、混淆方式全部重构。

2201_76125261的博客 351

在OSG中嵌入OpenGL代码

思路:在osg中创建结点, 比如Geometry对象, 然后给该对象添加DrawCallback, 在这个DrawCallback中使用opengl进行绘制。 (1)继承osg::Drawable::DrawCallback,在 drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable)函数里添加opengl代码。 (2)Drawable设置绘制回调函数,并注意要把显示列表设置为false: geomet

weixin_41217371的博客 1077

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

利用OSG进行几何球体绘制

核心逻辑就是顶点数组的计算,设半径长为r,原点为O,球体表面上的任意点P(x, y, z)有x = r * sin(a) * cos(b);其中a为OP向量与z轴的夹角,b为OP向量在xoy平面上的投影与x轴的夹角,以夹角a和夹角b为自变量(-90°

weixin_48106801的博客 1512

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OSG::绘制

本例子演示了绘制不同的几何图元。 osg::PrimitiveSet::POINTS对应OpenGL中的GL_POINTS绘制单独的点 osg::PrimitiveSet::LINES对应OpenGL中的GL_LINES绘制每两点连接的线 osg::PrimitiveSet::LINE_STRIP对应OpenGL中的GL_LINE_STRIP绘制依次连接各点的线 osg::Primitiv

a498506133的专栏 2327

OSG学习笔记-场景基本绘制类(3-1)

场景基本绘制类 在OSG中创建几何体的方法比较简单通常有3种处理几何体的手段:一是使用松散封装的OpenGL绘图基元,二是使用OSG中基本几何体,三是从文件中导入场景模型。使用松散封装的OpenGL绘图基元绘制几何体具有很强的灵活性,但工作量通常非常大,当面对大型场景时,绘制几何体将是一项非常艰巨而富有挑战的工作,因此,通常还是采用读入外部模型的方法。读取外部模型的方法在后面会有专门的介绍。 1、向量与数组类 数据类型 用途 osg:...

liangfei868的博客 1602

OSG 渲染剖析 之 Geometry 的 VBO生成

对于一个渲染引擎的渲染过程,我们一般关心的是渲染引擎如何组织、绘制场景对象。OSG 通过状态树与渲染树对渲染节点进行分组、排序与渲染。我们先抛开OSG 事件更新与处理等宏观渲染过程,这里我们从更细的角度研究OSG 是如何将场景对象数据与状态转换成OpenGL 具体实现。 如果让你设计一个渲染引擎渲染场景对象,你通常会怎么做?我们一般都会这样做:首先设计场景对象的组织与数据封装类,将数据从文件或程...

fatcat123的博客 2037

osg画线_osggeometry例子 | 学步园

本例子演示了绘制不同的几何图元。osg::PrimitiveSet::POINTS对应OpenGL中的GL_POINTS绘制单独的点osg::PrimitiveSet::LINES对应OpenGL中的GL_LINES绘制每两点连接的线osg::PrimitiveSet::LINE_STRIP对应OpenGL中的GL_LINE_STRIP绘制依次连接各点的线osg::PrimitiveSet::LI...

weixin_29807507的博客 823

osg学习-1《绘制基本单元》

osg中绘制并渲染几何体主要有如下3大步骤:(1)创建各种向量数据,如顶点、纹理坐标、颜色和法线等。需要注意的是,添加顶点数据时主要按照逆时针顺序添加,以确保背面剔除(backface culling)的正确(后面还会有介绍)。(2)实例化一个几何体对象(osg:Geometry),设置顶点坐标数组、纹理坐标数组、颜色数组、法线数组、绑定方式及数据解析。(3)加入叶节点绘制并渲染。...

love code, love life. 2281

OSG数学+基本图元/几何体+OpenGL方式绘制——Part2(官方教程后补)

osg72讲

qq_42491346的博客 1012
上一篇: Qt字符串转换
下一篇: QT+VS配置及调试
HelloEarth_
博客等级 码龄9年 38粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值