OSG学习 GraphicsContext与窗口建立

本文介绍了OSG中GraphicsContext的作用及其实现原理。GraphicsContext作为图形设备上下文,负责图形的渲染与显示,并且与OpenGL的hrc类似。文章还详细讲解了如何创建GraphicsContext及其所需的Traits参数。
摘要由CSDN通过智能技术生成

GraphicsContext ,图形设备上下文。就像在使用OpenGL在win32的窗口里绘制的时候。曾使用的hrc = wglCreateContext(hdc)一样。创建一个图形设备上下文 ,然后使用wglMakeCurrent(hdc,hrc)设置当前使用的图形设备一样,在这之后,我们就可以使用OGL绘制图形一样。osg中的GraphicsContext 就是跟hrc一样的。只是它将所有需要的内容集成在GraphicsContext这个类当中。这就是面向对象的封装性>_<。

在打开osg/GraphicsContext的头文件当中.我们可以找到这么一些函数 swapBuffers() makeCurrent() 等与我们之前所说的可以说十分相同的.因此对于在OSG当中需要最终显示图形的地方就是这个GraphicsContext .

这个时候我们得到的是一个全屏的窗口.这是默认的创建的一个GraphicsContext.( 通常情况下只有一个).它是通过执行 Viewer::realize()函数创建的. 最后执行View::setUpViewAcrossAllScreens() 创建全屏的GraphicsContext你可详看源码 就可以发现它就是创建一个GraphicsContext..并把它附加到viewer 的主摄像机上..因此我们最后看到的结果就是在全屏上显示一头牛…假设没有这个GraphicsContext 就会看不到.在后面我会用一副图来说明摄像机与GraphicsContext得关系.这是至关重要的.因为.每个摄像机若需要显示场景.则必须要有一个GraphicsContext.来负责显示.不管是主摄像机还是从摄像机.(Viewer可以有多个摄像机).

这里写图片描述

在我们了解了GraphicsContext之后.其实上面这个图已经给我们一个很大的启发了.其实最后的GraphicsContext应当是GraphicsWindowWIN32或者GraphicsWindowX11等三个中的一个.这是面向对象多态性的体现.. 因此.我们现在就要开始创建一个GraphicsContext了.

在创建之前.我也许需要说明一个.static GraphicsContext* GraphicsContext::createGraphicsContext(Traits _traits) 需要传入一个Traits的变量.因此我们需要了解这个Traits.
Traits.是什么呢?它GraphicsContext一些特征.我罗列一些能够表示这些特征的属性就能够非常直白的说明这个对象了.
_traits->x //x偏移
_traits->y //y偏移
_traits->width //宽度
_traits->height //高度
_traits->doubleBuffer //是否支持双缓存
_traits->sharedContext //共享GraphicsContext
_traits->windowName //窗口名称
_traits->windowDecoration //是否支持窗口一些装饰属性..如最大化 最小化等

_traits->inheritedWindowData //继承自某个窗口句柄? 这个可以用于嵌入到QT.MFC等GUI系统中.

因此只要设置这些内容.并调用上面的方法则会创建一个GraphicsContext. .而如上那个函数关于创建GraphicsContext实则应当是调用了窗口系统API 来创建的.

当你去详细阅读 GraphicsWindowWIN32.cpp 文件和GraphicsWindow 头文件时.你会发觉设计的非常巧妙. 用static全局静态变量和 宏定义实现这个非常宏伟的API获得…

因此 假设我们使用的是Window系统 那么所创建的GraphicsContext 则win32模式的.那么具体的窗口创建或者说嵌入等.请详细看GraphicsWindowWIN32.cpp 我们可以非常熟悉的看到开头部分所叙述的wgl等函数..很熟悉吧..
说了这么多.我们是否应当创建一个窗口来实践一下呢? 这将在之后的代码当中详细说出..
为了渲染与显示图形.. 我们需要一个视景器.osgViewer::Viewer ..Viewer当中包含一个主摄像机.因此我们不必在创建一个摄像机了.好了.开始代码的叙述.由于我们只是创建一个简单的WIN32窗口 并没有嵌入MFC.只需设置一些相关的值即可.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值