调试最长的一帧(第18天)

本文详细介绍了OSG(OpenSceneGraph)中场景渲染的具体流程,包括如何通过渲染器Renderer进行数据传递,以及如何利用SceneView完成场景的筛选与绘制工作。此外还探讨了摄像机、图形设备与多线程模型在渲染过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现一个错别字,改过来,哈哈,

先看看总体流程

直奔renderer::draw()

 

为了查询gpu,在main()函数先设置,要不没法往下调试

 

重点落在sceneView::draw()以后深入

 

需要删除的对象包括过期的显示列表,纹理,着色器等

 

 

是时候亮出这张图了

抄一抄,我觉得写的很好。

无论是场景的渲染还是绘制工作,最后都要归结到场景视图SceneView的相应实现函数中去完成。渲染器Renderer只是一个更为方便和直观的公用接口而已。

osg视景器的摄像机(包括主摄像机_camera和从摄像机组_slaves)均包含了与其对应的渲染器Renderer和图形设备GraphicsContext

同时当我们使用setSceneData将场景图形的根节点关联到视景器时,这个根节点实质上被添加到此viewer对象中每个主/从摄像机的子节点。

因此,我们可以通过改变摄像机的观察矩阵来改变我们观察这个场景的视角。

场景的筛选CULL和绘制Draw实质上都由内部类osgUtil::Sceneview来完成的。但是OSG也为场景渲染的工作提供了良好的公用接口渲染器。渲染器Renderer负责将场景绘制所需的各种数据(OpenGL状态值,显示设置,筛选设置等)传递给SceneView对象,并调用SceneView::cull和SceneView::draw函数,以完成场景的筛选/绘制工作。

摄像机所对应的图形设备GraphicsContext同样也可能负责调用SceneView::draw函数,这与我们选择的线程模型有关。事实上。由于OSG的多线程模型将为每一个图形设备创建一个专门的工作线程,并在其中处理与场景绘制相关的主动工作,因此GraphicsContext类在某种意义上也可以视作SceneView的一个公有实现接口。不过,它更重要的意义在于,它是OSG与特定操作系统平台API的接口.

调一调,先注释掉单线程。

 

开启摄像机线程了

并行堆栈中

分页数据库开始启动了

可以拉回来了。场景视图的工作过程中将遍历场景图形的根节点,此时只要获取对应摄像机的子节点就可以了。

下一步要集中在SceneView内部了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值