【OSG】将显示的图形窗口化
窗口化原理
有时为了方便控制场景渲染,需要设置一个合适的图形环境窗口(即窗口化)。
创建图形环境的主要步骤如下:
(1)通过WindowingSystemInterface类得到系统窗口接口,该系统接口主要是为了关联窗口系统与图形环境。
(2)下面是OSG中图形环境的主要特性,但在实际应用的过程中,没有必要设置每一个参数,只需根据实际需要来设置合理的参数即可。
x,y,width,height;//窗口的坐标、高度及宽度,默认值都为0
windowDecration(false), //是否支持窗口扩展的功能,Win32中style
supportsResize(true), //是否支持窗口缩放
red(8), //红色位数,默认8位
blue(8), //蓝色位数,默认8位
green(8), //绿色位数,默认8位
alpha(0), //alpha值位数,透明度,默认没有alpha通道,为RGB格式。
depth(24), //颜色的深度(16,24,32),默认使用24位
stencil(0), //模板默认无
sampleBuffers(0), //采样缓存,默认无
samples(0), //采样倍数(抗锯齿的倍数),默认无
pbufferStereo(false), //pbuffer,默认不支持
quadBufferStereo(false), //立体四缓存,主要在高端显卡上有,如QUDRO显卡上。
doubleBuffer(false), //是否支持双缓存,默认不支持
target(0), //目标
format(0), //格式
level(0), //嵌套的层数,默认无
face(0), //面
mipMapGeneration(false) //是否支持生成Mipmap,默认不支持
vsync(true), //是否支持同步,默认同步模式
useMultiThreadedOpenGLEngine(false), //是否采用多线程,默认不支持
useCursor(true), //是否使用鼠标的指针,默认使用
sharedContext(0), //共享上下文
setInheritedWindowPixelFormat(false) //是否继承Window中的位格式
(3)通过图形环境特性创建图形环境。通过调用一个静态成员函数创建图形环境的代码如下:
osg::GraphicsContext::createGraphicsContext(traits.get());
(4)通过图形环境创建窗口(句柄hwnd)。
示例代码
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
int main()
{
//创建Viewer对象,场景浏览器
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
//创建场景组节点
osg::ref_ptr<osg::Group> root = new osg::Group();
//读取模型
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
root->addChild(node.get());
//设置图形环境特性
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
traits->x = 0;
traits->y = 0;
traits->width = 1000;
traits->height = 800;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
//创建图形环境特性
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
if (gc.valid())
{
osg::notify(osg::INFO)<<" GraphicsWindow has been created successfully."<<std::endl;
//清除窗口颜色及清除颜色和深度缓冲
gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f));
gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
else
{
osg::notify(osg::NOTICE)<<" GraphicsWindow has not been created successfully."<<std::endl;
}
//根据分辨率来确定合适的投影来保证显示的图形不变形
double fovy, aspectRatio, zNear, zFar;
viewer->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
double newAspectRatio = double(traits->width) / double(traits->height);
double aspectRatioChange = newAspectRatio / aspectRatio;
if (aspectRatioChange != 1.0)
{
//设置投影矩阵
viewer->getCamera()->getProjectionMatrix() *= osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0);
}
//设置视口
viewer->getCamera()->setViewport(new osg::Viewport(0,0, traits->width, traits->height));
//设置图形环境
viewer->getCamera()->setGraphicsContext(gc.get());
//优化场景数据
osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
return 0 ;
}
没有窗口化的图:
窗口化之后的图:
这样也可以避免一些全屏显示带来的显示问题。例如双屏的时候运行程序带来的如下问题。
【OSG】将显示的图形窗口化的更多相关文章
- Mac ssh登陆linux并且显示linux图形
背景: Mac 通过[终端]ssh登陆linux并且在Mac显示linux图形 Mac 主机IP: 10.2.1.1 linux 主机IP: 192.168.1.1 说明: 想要ssh访问并且显示li ...
- windows 下 putty 登陆服务器 显示matlab图形界面
本文需要下载 putty.exe 和 pscp.exe :http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Xming 主 ...
- [osg]osg窗口显示和单屏幕显示
osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("cow.osg"); osg::ref_ptr&l ...
- 使用mobaXtrem显示CentOS图形
安装环境 yum install -y xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 \mesa-l ...
- Linux使用远程X Server显示图形
背景 通常我们不希望在服务器上安装图形界面,但有时候有些程序需要图形界面,比如安装oracle的时候.此时,可以配置让Linux使用远程的X Server进行图形界面显示. 首先要明确的是Linux ...
- zabbix 在图形中显示网络设备的接口描述
zabbix原始模板没有提供来显示网络设备接口的描述,我们通常看到的图形显示是下面这样的: zabbix 3之后图形显示变化蛮大的,但我们乍一看,并不知道这个ethernet0/1是什么接口,网络设备 ...
- linux下tomcat6无法显示图片验证码 少了图形插件
linux下tomcat6无法显示图片验证码(windows下显示正常) 原创 2015年10月20日 10:31:47 3526 linux下tomcat6无法显示图片验证码(windows下显示正 ...
- 使用Xming显示Oracle Linux图形界面
如果你在尝试各种官方说明文档中的方法之后,xclock仍然无法远程显示. 系统 Win10 - Oracle Linux 7.5 Xming的文档以及网上教程都说的是Xming相关的配置 但是,要显示 ...
- OSG中的智能指针
在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用 ...
随机推荐
- Linux入门第一天——环境搭建补充内容(xshell与虚拟机等操作)
一.xShell的安装和使用 前往官网下载一个个人版的 xShell :https://www.netsarang.com/products/xsh_overview.html 要更换免费版的putt ...
- Boltzmann机神经网络python实现
(python 3) import numpy from scipy import sparse as S from matplotlib import pyplot as plt from scip ...
- 【LNOI2014】LCA
题面 题解 考察\(dep[\mathrm{LCA}(i, x)]\)的性质,发现它是\(i\)和\(x\)的链交的长度. 那么对每个\(i\)所在的链打一个区间加标记,询问时算一下\(x\)所在的链 ...
- 【RedHat Linux】 链路聚合
[链路聚合] RHEL 7运行模式:teamd 守护进程, teamdctlroundrobin 轮询activebackup 热备份, 其中一个位为backuploadbalance 负载均衡lac ...
- iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字
iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字 简述:NSString * regex_0 = @"\\d{1,}"; /*允许首位为0*/ NSString * re ...
- [TJOI2015]概率论[卡特兰数]
题意 \(n\) 个节点二叉树的叶子节点的期望个数. \(n\leq 10^9\) . 分析 实际询问可以转化为 \(n\) 个点的不同形态的二叉树的叶子节点总数. 定义 \(f_n\) 表示 \(n ...
- Zabbix实战-简易教程--日志类
一.主动模式和被动模式介绍 要监控日志,必须使用主动模式,那么,什么是主动模式?什么是被动模式呢? 1.主动模式和被动模式 主动模式 主动模式通讯过程: ● Agent打开TCP连接(主动检测变成Ag ...
- Docker 创建虚拟机并且远程链接
快读创建虚拟机 使用我编辑的镜像(688M) docker run -itd --name=test03 -p 5523:22 registry.cn-beijing.aliyuncs.com/act ...
- LINUX系统下跑分测试脚本:unixbench.sh
linux 系统跑分测试脚本: 一.下载脚本: wget http://teddysun.com/wp-content/uploads/unixbench.sh 二.更改权限: ...
- fiddler对安卓APP进行抓包
操作流程: 1.fiddler导出ca证书 操作路径: Tools -> Fiddler Options -> HTTPS -> Export Fiddler Root Certif ...