OpenVR之IVRCompositor
IVRCompositor允许应用程序用它来渲染3D内容。
vr::IVRCompositor接口提供访问Compositor子系统的接口。Compositor通过关注那些容易影响VR体验的操作比如畸变,预测,同步以及其他细微问题来简化显示图像到用户的流程。
应用程序调用WaitGetPoses来获得一系列姿态数据,用来渲染相机和其他追踪对象,像往常一样(使用IVRSystem接口提供的信息)渲染左右眼,同时最终将这些未畸变的纹理提交到Compositor(混合器)显示(在它自己的窗口显示)。
建议继续Present(呈现)应用程序自己的窗口,重复使用左或右眼相机渲染目标来绘制单个四边形(也许会裁剪到一个更低的视场角以便隐藏隐藏区域)
比如:
while Running:WaitGetPosesRender Left and Right camerasSubmit Left and Right render targetsUpdate game logic
另外,可能为了在整个相机共享单个渲染目标而串行化渲染,比如:
while Running:WaitGetPosesRender(L)Submit(L)Render(R)Submit(R)Update game logic
当应用程序退出时,或在一行内停止调用Submit超过10帧时,它淡退到一个空白格子场景中。这是为了避免让用户处在一个未追踪的环境中,以免用户翻倒或跑进墙里面去。当所有应用程序与混合器断开连接时,除非以命令行参数--keepalive启动,否则它会在2秒后自动退出。
枚举变量:
Compositor_DeviceType:为关联设备指定显卡API
enum Compositor_DeviceType
{Compositor_DeviceType_None,Compositor_DeviceType_D3D9,Compositor_DeviceType_D3D9Ex,Compositor_DeviceType_D3D10,Compositor_DeviceType_D3D11,Compositor_DeviceType_OpenGL
};
Compositor_FrameTiming:提供单个帧的时序信息到应用程序
始终为对应的版本将size变量设置为sizeof(Compositor_FrameTiming)以避免内存崩溃,在C#中使用方式如下:
(uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(Compositor_FrameTiming));
属性:
frameStart - 每帧的参考时间,这不一定是均匀分布的。
frameVSync - 从frameStart开始到下一个VSync时间。使用公式(current.frameStart + current.frameVSync)-(previous.frameStart + previouse.frameVSync)来计算帧间距。
droppedFrames - 自前一个帧开始由DXGI的GetFrameStatistics上报的droppedFrames(丢失帧)的数量。这是自最近一次调用它以来的一个PresentRefreshCount的delta值。它是无符号保存的,但是已知它是负的,因此在使用前需要先强制转换为int。
frameIndex - 每帧递增。可用低于更新的频率来调用GetFrameTiming遍历历史,直到看见认识的帧为止。
pose - 用于渲染该帧的Hmd姿态
struct Compositor_FrameTiming
{uint32_t size; // sizeof(Compositor_FrameTiming)double frameStart;float frameVSync; // seconds from frame startuint32_t droppedFrames;uint32_t frameIndex;vr::TrackedDevicePose_t pose;
};
Compositor_TextureBounds
运行应用程序控制要在帧缓冲中用到的纹理部分。
struct Compositor_TextureBounds
{float uMin, vMin;float uMax, vMax;
};
接口:
vr::IVRCompositor接口包含以下函数:
初始化:
GetLastError-返回混合器中最近发生的错误信息
virtual uint32_t GetLastError( VR_OUT_STRING() char* pchBuffer, uint32_t unBufferSize ) = 0;
核心函数:
WaitGetPoses:返回姿态信息以供渲染场景使用
virtual void WaitGetPoses( VR_ARRAY_COUNT(unPoseArrayCount) TrackedDevicePose_t* pPoseArray, uint32_t unPoseArrayCount ) = 0;
跟多关于姿态的信息,可参考IVRSystem::GetDeviceToAbsoluteTrackingPose
Submit:更新场景纹理到显示器,若pBounds为NULL,则整个纹理会被使用到。
OpenGL dirty state:glBindTexturevirtual void Submit( Hmd_Eye eEye, void* pTexture, Compositor_TextureBounds* pBounds ) = 0;
ClearLastSubmittedFrame:清除最后使用Submit提交的帧,这会引起混合器显示格子直到再次调用Submit。
virtual void ClearLastSubmittedFrame() = 0;
访问器:
SetGamma:给混合器窗口设置gamma值
virtual void SetGamma( float fGamma ) = 0;
GetGamma:获取混合器窗口的gamma值:
virtual float GetGamma() = 0;
SetTrackingSpace:设置由WaitGetPoses返回的追踪空间
virtual void SetTrackingSpace( TrackingUniverseOrigin eOrigin ) = 0;
GetTrackingSpace:获取由WaitGetPoses返回的当前追踪空间
virtual TrackingUniverseOrigin GetTrackingSpace() = 0;
SetVSync:开启或关闭混合器窗口的垂直同步功能
virtual void SetVSync( bool bVSync ) = 0;
GetVSync:若混合器窗口的垂直同步功能开启,则返回true
virtual bool GetVSync() = 0;
GetFrameTiming:若时序数据被设置则返回true。若nFramesAgo比保存历史大则设置最老的时序信息
确保在调用该函数前,设置timing.size = sizeof(Compositor_FrameTiming)。
历史缓冲当前保存最近128帧数据。
virtual bool GetFrameTiming( Compositor_FrameTiming *pTiming, uint32_t unFramesAgo = 0 ) = 0;
IsFullscreen:返回混合器是否全屏布尔值
virtual bool IsFullscreen() = 0;
淡化支持:
FadeToColor:将HMD视觉淡入到指定颜色。淡化接收参数fSeconds,介于0.0到1.0之间的颜色值。根据alpha参数该颜色在场景顶部淡化。设置FadeToColor(0.0, 0.0, 0.0, 0.0)则会删除淡化颜色。
virtual void FadeToColor( float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground = false ) = 0;
焦点:
CompositorBringToFront:将混合器窗口带到前面。这对覆盖在HMD上的任何窗口以达到朦胧效果很有用途。
virtual void CompositorBringToFront() = 0;
CompositorGoToBack:将混合器窗口推到后面去。这对允许其他应用程序要直接绘制到HMD很有帮助。
virtual void CompositorGoToBack() = 0;
CompositorQuit:告诉混合器进程要清空资源并退出了。shutdown时不一定要调用该函数。一般情况下,混合器会基于正在运行的应用程序来管理它自己的生命周期。
virtual void CompositorQuit() = 0;
参考网址
OpenVR之IVRCompositor相关推荐
- OpenVR API简单介绍
最近可能是元宇宙这概念火了,有挺多小伙伴私信说对VR开发产生浓浓的兴趣,想知道关于OpenVR的API介绍等等. 大家可以看看官方的OpenVR API 链接:官方OpenVR API 如果想在开发V ...
- 如何用openvr api打开vive前置摄像头
随着越来越多的开发者开始他们的VR开发工作,他们看到了这项技术的巨大潜力,像是Valve这样的公司正在想办法保证他们的软件开发包(SDK)能够提供尽量多的功能.今天这家公司发布了其针对SteamVR的 ...
- OpenVR学习01 成功打开了VR设备
2019独角兽企业重金招聘Python工程师标准>>> 目标是生成一个exe文件, 打开VR设备, 打开后, 这个exe就执行结束了, 但VR设备还处于运行状态 并没有指定哪种VR设 ...
- Unity3D OpenVR SteamVR 在头盔视觉前面常驻文本
我期望在玩家视觉前方常驻一点文本,用于做有趣的交互,实现方法很简单 在开始之前,期望大家已阅读过基于 SteamVR 的 Unity3D 相关博客,如果还没了解相关知识,请参阅如下博客 Unity O ...
- 基于openVR实现任意软件界面映射到VR眼镜
原理:就是用openVR驱动各种类型的VR眼镜驱动,然后不断给指定软件截图用opengl渲染到VR眼镜 这个代码的功能了就是后天运行,创建udp广播,收到"close"命令就启动V ...
- 【openVR】从零开始运行起第一个openVR界面项目
系统:window 10 记录一下实现第一个openVR带界面程序的过程.刚装好系统,啥都没有.这也算真正的从零开始了把. openVR的界面项目是指openVR源码中的helloworld over ...
- 7个VR开发中容易混淆的概念:SteamVR、OpenVR、OpenXR……
在进行Unity VR应用程序开发过程中,有几个容易混淆的概念, 本文将尝试做一次区分,如果有任何疑问,读者可在文末留言共同讨论.这几个概念包括OpenVR .OpenVR Desktop.OpenV ...
- SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)
<SteamVR2.0开发指南> 版本 作者 参与者 完成日期 备注 SteamVR2.0_Guide_V01_1.0 严立钻 2019.01.23 ++++SteamVR2.0开发指南: ...
- OpenVR设备位置获取的两种方法
OpenVR 下,获取设备位置的方法有两个:WaitGetPoses 和 GetDeviceToAbsoluteTrackingPose. WaitGetPoses: 会阻塞程序运行,直到底层获取到新 ...
最新文章
- Linux shell 学习笔记(16)— shell 入门总结
- Microsoft R 和 Open Source R,哪一个才最适合你?
- SVM在R语言中的使用
- Effective C++ --6 继承与面向对象设计
- Cannot maintain customer-spec. event handler registration in SAP system
- 安装eclipse的JRebel6.4.3的插件
- 草稿 断开始datagrewvies 01
- JAVA中的线程安全与非线程安全,java面试题,java高级笔试题
- [转]状态压缩dp(状压dp)
- TCP/IP网络编程(1)
- FPGA浮点数定点数的处理
- CMOS数字集成电路
- 计算机对教育的重要性 英语作文,关于教育的英语作文 教育重要性英语作文!
- 洛谷 P2672 推销员 解题报告
- Tomcat启动之后遇到“ran out of the normal time range, it consumed [2000] milliseconds.”?
- MEM/MBA 写作-论证有效性分析(04)逻辑缺陷-偷换概念以偏概全
- MySQL数据库基本命令
- app logo显示不全没有铺满
- js 幻灯片放映图片_如何制作数据库驱动的首页幻灯片放映
- Ps的动感模糊和扭曲效果
热门文章
- Cortex-A 系列CP15协处理器简单解析
- c语言艺术图案编程,C语言编程艺术--条件编译(原创)
- 关于Unity3d中的自动寻路
- 移动端保存照片到手机相册
- blog 2019.3.6 day9 java内存的操作
- 高颜值蓝牙耳机哪款好?女神都爱的五款时尚蓝牙耳机推荐
- Android高仿新浪微博点赞动画
- h5实现 — 跳转到微信输入密码支付
- 跨学科应用!GAN论文登上Nature子刊
- python清空文本框_WEB自动化——解决python selenium使用clear清除文本框内容失效的问题...