《最长的一帧》笔记

本文是《最长的一帧》笔记,详细解析osg图形框架的事件处理、图形上下文、渲染流程、多线程渲染模式等关键概念,包括事件队列、视景器、摄像机漫游、场景筛选、绘制、状态树、渲染树的构建与遍历,以及线程同步策略。笔记涵盖从osgGA::GUIEventHandler事件处理到osgViewer::Viewer的多线程渲染模式,深入探讨了osg的内部工作机制。

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

第一日:

  1. eventTraversal 处理鼠标、键盘事件,以及摄像机与场景图形的事件回调

  2. updateTraversal 负责遍历所有的更新回调,以及更新DatabasePager与ImagePager两个重要的分页数据处理租组件

  3. randeringTraversals 使用复杂的线程处理方法,完成场景的筛选(cull)和绘制(draw)工作

  4. _eventQueue 是用于存储该视景器的事件队列

  5. osgGA::GUIEventAdapter 是osg中代表事件的类

  6. osgGA::GUIEventHandler 我们通过继承该类,并实现他的handle() 方法,来获取实时的键盘/鼠标输入,并进而实现相应的用户代码

  7. _cameraManipulator 它就是视景器中使用的场景漫游器实例

  8. osgGA::MatrixManipulator 新版osg已改名为osgGA::CameraManipulator, 如果想要实现自定义的场景漫游器,就覆写该类的handle方法和init方法

第二日:

  1. osg::GraphicsContext 图形设备上下文。要将osg嵌入GUI系统,需要设置一下三步:

                1. 设置窗口特性osg::GraphicsContext::Traits traits;

                2. 根据窗口特性,创建图形设备上下文(gc = osg::GraphicsContext::createGraphicsContext(traits));

                3. 将创建的图形设备上下文(gc),赋予场景所用的摄像机。

第三日:

        1. WindowingSystemInterface::createGraphicsContext 是纯虚函数,由osgViewer/GraphicsWindowWin32.cpp中的静态变量osg::WindowingSystemInterfaceProxy<Win32WindowingSystem> s_proxy_Win32WindowingSystem("win32") 实现对该虚函数的实现

第四日:

        1. osgViewer::Viewer::realize() 获取所有的图形上下文contexts,如果contexts为空,调用相关函数创建图形上下文;遍历contexts,执行图形上下文gc的realize(),makeCurrent(),releaseContext()

        2. 视景器Viewer的主/从摄像机均需要setGraphicsContext设置图形上下文,实际上也就是对应的显示窗口

        3. 如果窗口特性(Traits)中,开启了pbuffer选项,则osg将尝试创建osgViewer::PixelBufferWin32设备,以实现离屏渲染(Offscreen Render),纹理烘焙(Render To Texture)等工作,否则只建立通常的OpenGL窗口

第五日:

        1. osgViewer::Viewer::realize() 尾部执行设置线程

                1. SingleThread

                2. CullDrawThreadPerContext

                3. DrawThreadPerContext

                4. CullThreadPerCameraDrawThreadPerContext

        2. setUpThreading() 他的工作主要是处理单线程模式下,多处理器系统的数据线程分配方式

                1. 使用CUP0来处理用户更新,筛选和渲染等一切事务

                2. 使用CUP1来处理场景的两个分页数据库(DatabasePager)线程(他们分别用于处理本地和网络上的场景数据)

        3. Viewer::getScene() 获取当前视景器对应的osgViewer::Scene对象, 也就是场景。一个场景包含了唯一的场景图形跟节点,分页数据库(DatabasePager),以及分页图像库(ImagePager)

        4. getOrCreateCompileContext()

第六日:

        1. ViewerBase::getStats 获取osg::Stats对象,用以进行帧状态的保存和显示

        2. DeleteHandler 垃圾回收机制

        3. 视景器、摄像机与场景的关系

第七日:

        1. _eventHandlers 事件处理器组,每个视景器中都有一个事件处理器组,而不是一个事件处理器

        2. 事件队列的状态事件 事件队列是由GUIEventAdapter对象组成的链表,事件之间可能共同的参数和状态就是状态事件,比如坐标位置等

        3. VPW矩阵

                1. V 表示摄像机的观察矩阵(View Matrix),他的作用是把对象从世界坐标系转到摄像机坐标系;

                        localCoord = worldCoord * VM

                    观察矩阵可以理解为“摄像机在世界坐标系下的变换矩阵的逆矩阵”,他的实际意义表示摄像机在世界坐标系下的位置

                2. P 表示投影矩阵(Projection Matrix),当我们使用setProjectionMatrixAsPerspective之类的函数设置摄像机的投影矩阵时,相当于我们创建了一个视截锥体,并尝试将包含在其中的场景对象投影到镜头平面上来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值