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相关推荐

  1. OpenVR API简单介绍

    最近可能是元宇宙这概念火了,有挺多小伙伴私信说对VR开发产生浓浓的兴趣,想知道关于OpenVR的API介绍等等. 大家可以看看官方的OpenVR API 链接:官方OpenVR API 如果想在开发V ...

  2. 如何用openvr api打开vive前置摄像头

    随着越来越多的开发者开始他们的VR开发工作,他们看到了这项技术的巨大潜力,像是Valve这样的公司正在想办法保证他们的软件开发包(SDK)能够提供尽量多的功能.今天这家公司发布了其针对SteamVR的 ...

  3. OpenVR学习01 成功打开了VR设备

    2019独角兽企业重金招聘Python工程师标准>>> 目标是生成一个exe文件, 打开VR设备, 打开后, 这个exe就执行结束了, 但VR设备还处于运行状态 并没有指定哪种VR设 ...

  4. Unity3D OpenVR SteamVR 在头盔视觉前面常驻文本

    我期望在玩家视觉前方常驻一点文本,用于做有趣的交互,实现方法很简单 在开始之前,期望大家已阅读过基于 SteamVR 的 Unity3D 相关博客,如果还没了解相关知识,请参阅如下博客 Unity O ...

  5. 基于openVR实现任意软件界面映射到VR眼镜

    原理:就是用openVR驱动各种类型的VR眼镜驱动,然后不断给指定软件截图用opengl渲染到VR眼镜 这个代码的功能了就是后天运行,创建udp广播,收到"close"命令就启动V ...

  6. 【openVR】从零开始运行起第一个openVR界面项目

    系统:window 10 记录一下实现第一个openVR带界面程序的过程.刚装好系统,啥都没有.这也算真正的从零开始了把. openVR的界面项目是指openVR源码中的helloworld over ...

  7. 7个VR开发中容易混淆的概念:SteamVR、OpenVR、OpenXR……

    在进行Unity VR应用程序开发过程中,有几个容易混淆的概念, 本文将尝试做一次区分,如果有任何疑问,读者可在文末留言共同讨论.这几个概念包括OpenVR .OpenVR Desktop.OpenV ...

  8. 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开发指南: ...

  9. OpenVR设备位置获取的两种方法

    OpenVR 下,获取设备位置的方法有两个:WaitGetPoses 和 GetDeviceToAbsoluteTrackingPose. WaitGetPoses: 会阻塞程序运行,直到底层获取到新 ...

最新文章

  1. Linux shell 学习笔记(16)— shell 入门总结
  2. Microsoft R 和 Open Source R,哪一个才最适合你?
  3. SVM在R语言中的使用
  4. Effective C++ --6 继承与面向对象设计
  5. Cannot maintain customer-spec. event handler registration in SAP system
  6. 安装eclipse的JRebel6.4.3的插件
  7. 草稿 断开始datagrewvies 01
  8. JAVA中的线程安全与非线程安全,java面试题,java高级笔试题
  9. [转]状态压缩dp(状压dp)
  10. TCP/IP网络编程(1)
  11. FPGA浮点数定点数的处理
  12. CMOS数字集成电路
  13. 计算机对教育的重要性 英语作文,关于教育的英语作文 教育重要性英语作文!
  14. 洛谷 P2672 推销员 解题报告
  15. Tomcat启动之后遇到“ran out of the normal time range, it consumed [2000] milliseconds.”?
  16. MEM/MBA 写作-论证有效性分析(04)逻辑缺陷-偷换概念以偏概全
  17. MySQL数据库基本命令
  18. app logo显示不全没有铺满
  19. js 幻灯片放映图片_如何制作数据库驱动的首页幻灯片放映
  20. Ps的动感模糊和扭曲效果

热门文章

  1. Cortex-A 系列CP15协处理器简单解析
  2. c语言艺术图案编程,C语言编程艺术--条件编译(原创)
  3. 关于Unity3d中的自动寻路
  4. 移动端保存照片到手机相册
  5. blog 2019.3.6 day9 java内存的操作
  6. 高颜值蓝牙耳机哪款好?女神都爱的五款时尚蓝牙耳机推荐
  7. Android高仿新浪微博点赞动画
  8. h5实现 — 跳转到微信输入密码支付
  9. 跨学科应用!GAN论文登上Nature子刊
  10. python清空文本框_WEB自动化——解决python selenium使用clear清除文本框内容失效的问题...