英伟达VRS,通过改变帧的不同区域的着色速率来提高渲染性能和质量。

下载SDK:Unity 应用商店>> Vive Foveated Rendering

导入插件:在摄像机上挂载ViveFoveatedRendering脚本 勾选Manual Adjustment  选择适合自己的渲染方式

这个脚本我用Google翻译了一下

//========= Copyright 2020, HTC Corporation. All rights reserved. ===========using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.XR;
using System;namespace HTC.UnityPlugin.FoveatedRendering
{public static class FoveatedRenderingExtensions{public static T Clamp<T>(this T input, T min, T max) where T : IComparable{if (min.CompareTo(input) > 0){ return min; }else if (max.CompareTo(input) < 0){ return max; }return input;}}[RequireComponent(typeof(Camera))]public class ViveFoveatedRendering : MonoBehaviour{Camera thisCamera = null;CommandBufferManager commandBufferMgr = new CommandBufferManager();bool foveatedRenderingInited = false;bool foveatedRenderingActivated = false;RenderMode renderMode = RenderMode.RENDER_MODE_MONO;[SerializeField][Header("手动调整")]bool manualAdjustment = false;[SerializeField][Header("阴影率预设")]ShadingRatePreset shadingRatePreset = ShadingRatePreset.SHADING_RATE_HIGHEST_PERFORMANCE;[SerializeField][Header("模式预设")]ShadingPatternPreset patternPreset = ShadingPatternPreset.SHADING_PATTERN_NARROW;[SerializeField][Header("内区半径")]Vector2 innerRegionRadii = new Vector2(0.25f, 0.25f);[SerializeField][Header("中区半径")]Vector2 middleRegionRadii = new Vector2(0.33f, 0.33f);[SerializeField][Header("外区半径")]Vector2 peripheralRegionRadii = new Vector2(1.0f, 1.0f);[SerializeField][Header("内区阴影")]ShadingRate innerShadingRate = ShadingRate.X1_PER_PIXEL;[SerializeField][Header("中区阴影")]ShadingRate middleShadingRate = ShadingRate.X1_PER_2X2_PIXELS;[SerializeField][Header("外区阴影")]ShadingRate peripheralShadingRate = ShadingRate.X1_PER_4X4_PIXELS;/// <summary>/// 启用中心渲染/// </summary>/// <param name="activate"></param>public void EnableFoveatedRendering(bool activate){if (foveatedRenderingInited && activate != foveatedRenderingActivated){foveatedRenderingActivated = activate;if (activate){commandBufferMgr.EnableCommands(thisCamera);}else{commandBufferMgr.DisableCommands(thisCamera);}}}/// <summary>/// 设置阴影率预设/// </summary>/// <param name="inputPreset"></param>public void SetShadingRatePreset(ShadingRatePreset inputPreset){if (foveatedRenderingInited){shadingRatePreset = inputPreset.Clamp(ShadingRatePreset.SHADING_RATE_HIGHEST_PERFORMANCE, ShadingRatePreset.SHADING_RATE_MAX);ViveFoveatedRenderingAPI.SetFoveatedRenderingShadingRatePreset(shadingRatePreset);if (shadingRatePreset == ShadingRatePreset.SHADING_RATE_CUSTOM){SetShadingRate(TargetArea.INNER, innerShadingRate);SetShadingRate(TargetArea.MIDDLE, middleShadingRate);SetShadingRate(TargetArea.PERIPHERAL, peripheralShadingRate);}GL.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.UPDATE_GAZE);}}/// <summary>/// 阴影率预设/// </summary>/// <returns></returns>public ShadingRatePreset GetShadingRatePreset(){return shadingRatePreset;}/// <summary>/// 设置模式预设/// </summary>/// <param name="inputPreset"></param>public void SetPatternPreset(ShadingPatternPreset inputPreset){if (foveatedRenderingInited){patternPreset = inputPreset.Clamp(ShadingPatternPreset.SHADING_PATTERN_WIDE, ShadingPatternPreset.SHADING_PATTERN_MAX);ViveFoveatedRenderingAPI.SetFoveatedRenderingPatternPreset(patternPreset);if (patternPreset == ShadingPatternPreset.SHADING_PATTERN_CUSTOM){SetRegionRadii(TargetArea.INNER, innerRegionRadii);SetRegionRadii(TargetArea.MIDDLE, middleRegionRadii);SetRegionRadii(TargetArea.PERIPHERAL, peripheralRegionRadii);}GL.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.UPDATE_GAZE);}}/// <summary>/// 阴影模式预设/// </summary>/// <returns></returns>public ShadingPatternPreset GetPatternPreset(){return patternPreset;}/// <summary>/// 设置阴影/// </summary>/// <param name="targetArea"></param>/// <param name="rate"></param>public void SetShadingRate(TargetArea targetArea, ShadingRate rate){if (foveatedRenderingInited){var clampedRate = rate.Clamp(ShadingRate.CULL, ShadingRate.X1_PER_4X4_PIXELS);switch (targetArea){case TargetArea.INNER:innerShadingRate = clampedRate;break;case TargetArea.MIDDLE:middleShadingRate = clampedRate;break;case TargetArea.PERIPHERAL:peripheralShadingRate = clampedRate;break;}ViveFoveatedRenderingAPI.SetShadingRate(targetArea, clampedRate);GL.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.UPDATE_GAZE);}}/// <summary>/// 阴影/// </summary>/// <param name="targetArea"></param>/// <returns></returns>public ShadingRate GetShadingRate(TargetArea targetArea){switch (targetArea){case TargetArea.INNER:return innerShadingRate;case TargetArea.MIDDLE:return middleShadingRate;case TargetArea.PERIPHERAL:return peripheralShadingRate;}return ShadingRate.CULL;}/// <summary>/// 设置区域半径/// </summary>/// <param name="targetArea"></param>/// <param name="radii"></param>public void SetRegionRadii(TargetArea targetArea, Vector2 radii){if (foveatedRenderingInited){var clampedRadii = new Vector2(radii.x.Clamp(0.01f, 10.0f), radii.y.Clamp(0.01f, 10.0f));switch (targetArea){case TargetArea.INNER:innerRegionRadii = clampedRadii;break;case TargetArea.MIDDLE:middleRegionRadii = clampedRadii;break;case TargetArea.PERIPHERAL:peripheralRegionRadii = clampedRadii;break;}ViveFoveatedRenderingAPI.SetRegionRadii(targetArea, clampedRadii);GL.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.UPDATE_GAZE);}}/// <summary>/// 获取区域半径/// </summary>/// <param name="targetArea"></param>/// <returns></returns>public Vector2 GetRegionRadii(TargetArea targetArea){switch (targetArea){case TargetArea.INNER:return innerRegionRadii;case TargetArea.MIDDLE:return middleRegionRadii;case TargetArea.PERIPHERAL:return peripheralRegionRadii;}return Vector2.zero;}void OnEnable(){ViveFoveatedRenderingAPI.InitializeNativeLogger(str => Debug.Log(str));thisCamera = GetComponent<Camera>();foveatedRenderingInited = ViveFoveatedRenderingAPI.InitializeFoveatedRendering(thisCamera.fieldOfView, thisCamera.aspect);if (foveatedRenderingInited){var currentRenderingPath = thisCamera.actualRenderingPath;if (currentRenderingPath == RenderingPath.Forward){commandBufferMgr.AppendCommands("Enable Foveated Rendering", CameraEvent.BeforeForwardOpaque,buf => buf.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.ENABLE_FOVEATED_RENDERING),buf => buf.ClearRenderTarget(false, true, Color.black));commandBufferMgr.AppendCommands("Disable Foveated Rendering", CameraEvent.AfterForwardAlpha,buf => buf.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.DISABLE_FOVEATED_RENDERING));}else if (currentRenderingPath == RenderingPath.DeferredShading){commandBufferMgr.AppendCommands("Enable Foveated Rendering - GBuffer", CameraEvent.BeforeGBuffer,buf => buf.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.ENABLE_FOVEATED_RENDERING),buf => buf.ClearRenderTarget(false, true, Color.black));commandBufferMgr.AppendCommands("Disable Foveated Rendering - GBuffer", CameraEvent.AfterGBuffer,buf => buf.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.DISABLE_FOVEATED_RENDERING));commandBufferMgr.AppendCommands("Enable Foveated Rendering - Alpha", CameraEvent.BeforeForwardAlpha,buf => buf.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.ENABLE_FOVEATED_RENDERING));commandBufferMgr.AppendCommands("Disable Foveated Rendering - Alpha", CameraEvent.AfterForwardAlpha,buf => buf.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.DISABLE_FOVEATED_RENDERING));}EnableFoveatedRendering(true);bool isEyeTracked = ViveFoveatedGazeUpdater.AttachGazeUpdater(gameObject);if (manualAdjustment || (!ViveFoveatedInitParam.SetParamByHMD(this, isEyeTracked))){SetShadingRatePreset(shadingRatePreset);SetPatternPreset(patternPreset);}ViveFoveatedRenderingAPI.SetNormalizedGazeDirection(new Vector3(0.0f, 0.0f, 1.0f), new Vector3(0.0f, 0.0f, 1.0f));GL.IssuePluginEvent(ViveFoveatedRenderingAPI.GetRenderEventFunc(), (int)EventID.UPDATE_GAZE);}}void OnDisable(){EnableFoveatedRendering(false);commandBufferMgr.ClearCommands();ViveFoveatedRenderingAPI.ReleaseFoveatedRendering();ViveFoveatedRenderingAPI.ReleaseNativeLogger();foveatedRenderingInited = false;var gazeUpdater = GetComponent<ViveFoveatedGazeUpdater>();if (gazeUpdater != null){gazeUpdater.enabled = false;}}void OnPreRender(){if (XRSettings.enabled){switch (XRSettings.stereoRenderingMode){case XRSettings.StereoRenderingMode.MultiPass:renderMode = thisCamera.stereoActiveEye == Camera.MonoOrStereoscopicEye.Left ?RenderMode.RENDER_MODE_LEFT_EYE : RenderMode.RENDER_MODE_RIGHT_EYE;break;case XRSettings.StereoRenderingMode.SinglePass:renderMode = RenderMode.RENDER_MODE_STEREO;break;default:renderMode = RenderMode.RENDER_MODE_MONO;break;}}else{renderMode = RenderMode.RENDER_MODE_MONO;}ViveFoveatedRenderingAPI.SetRenderMode(renderMode);}}
}

眼球追踪技术 Unity+ HTC vive Pro + DroolonF1 (三)相关推荐

  1. 眼球追踪技术 Unity+ HTC vive Pro + DroolonF1 (一)

    本篇博客主要讲开发前的配置,如安装配置问题. 开发前需要准备: 1.DroolonF1设备 2.SR_Runtime驱动 3.SRinipal SDK 4.Unity开发引擎 建议2017.3版本以上 ...

  2. 眼球追踪技术 Unity+ HTC vive Pro + DroolonF1 (二)

    本篇将如何开发,如果您喜欢请收藏.点赞.打赏~ 博主使用环境:Unity 2018.3.7.   Win 10 x64. HTC vive Pro demo下载:下载地址 1.新建Camera 2.V ...

  3. 处理Unity中使用HTC VIVE PRo的SRWork插件若干问题

    一.介绍 HTC VIVE Pro版本的头盔显示器可以使用一个叫SRWork的工具轻松制作混合现实功能的案例,如图1所示:功能很强大,目前据我写 图1 这篇文真为止已经更新到了SRWork0.9.7. ...

  4. HTC vive pro unity开发者软件/SDK版本注意事项

    HTC vive pro & unity开发:SteamVR.VRTK.VRIK.facial tracker开发环境配置注意事项 1.在unity中配置SteamVR plugin Stea ...

  5. 【SR Works】使用HTC Vive Pro结合SteamVR在Unity中制作MR内容

    HTC Vive Pro有两个前置RGB摄像头,官方出了一套SR Works SDK来借助这两个摄像头实现MR功能. 本篇的目标是,成功运行官方的MR示例,并结合SteamVR和SR Works SD ...

  6. 英伟达最新公布的眼球追踪技术

    [转] https://www.leiphone.com/news/201607/HaIUFO0MiSbjVE67.html 人眼能看到的范围是有限的,如果你看着黑板上方的挂钟,那么你的目光聚集的地方 ...

  7. 巨头都在追逐的眼球追踪技术,究竟能带来什么?

    [转] https://m.leiphone.com/news/201707/aC1AcagZdojMomUj.html 人的身体有视觉.听觉.嗅觉味觉.触觉和运动五大感知系统,然而我们所接收的80% ...

  8. 深度 | 巨头都在追逐的眼球追踪技术,究竟能带来什么?

    眼球追踪就是这样一个让机器人更懂人类的技术. 人的身体有视觉.听觉.嗅觉味觉.触觉和运动五大感知系统,然而我们所接收的80%的信息都来自于眼睛. 眼睛不仅是我们的输入主设备,也是我们的输出设备.俗话说 ...

  9. 眼球追踪技术给各大科技巨头带来的四大应用前景

    原文标题:眼球追踪技术给各大科技巨头带来的四大应用前景 过去一年来,在硬件.软件和人工智能等多领域的共同助力下,眼球跟踪技术发展神速,成为众科技巨头眼中的下一个竞逐目标. Google和Faceboo ...

最新文章

  1. 基于SSM实现个人健康管理系统
  2. [architecture]-处理器的顺序和乱序执行
  3. 如何在三个月内获得三年的工作经验
  4. 元件原理图旋转45度_你能看懂电气原理图有多少?建议收藏共同学习
  5. TensorFlow 学习(十四)—— contrib 与 slim
  6. python的条件判断
  7. 20191127每日一句
  8. 理解AutoResetEvent与ManualResetEvent的区别
  9. 三十年中国GIS基础软件市场回顾与发展展望
  10. MATLAB初探:美国人口与年份数据拟合
  11. console连接h3c s5500_H3C交换机、路由器Console和Telnet密码配置
  12. 大数据开发工程师都需要学什么大数据课程?
  13. qcalendarwidget只显示月_本周新股14只连发!明日3只新股可申购,分别是中信博、圣湘生物、瑞晟智能...
  14. Linux进程间通信(七)---共享内存之shmget()、shmat()、shmdt()及其基础实验
  15. XMOS笔记1--LED的控制
  16. 图论 物联网_物联网工程题目 物联网在医疗领域的应用
  17. 2021年中国网络零售行业发展现状及行业发展趋势分析[图]
  18. mysql查询表中价格区间_MySQL统计价格区间内的商品数量sql语句
  19. 是男人就下100层【第一层】——高仿微信界面(2)
  20. PC端和移动端网页特效,fastclick插件,Swiper插件,Bootstrap等框架,本地存储

热门文章

  1. 2022年装饰行业市场分析
  2. matlab中clock是什么,matlab中的clock
  3. 【JSTL】JSP 标准标签库JSTL学习
  4. 这家200多年历史的中华老字号,是如何赢得今年快手中秋月饼品牌冠军的?
  5. 瑞昱rtl8168网卡支持Linux吗,我的集成网卡RTL8111/8168B终于搞定(非常感谢ubuntu中文论坛)...
  6. 指纹识别登录Windows Server服务器远程桌面
  7. 【杂谈】当你在凝视深渊的时候,深渊也正在凝视着你
  8. VML编辑器代码实现(转载)
  9. 【 IntelliJ IDEA 】设置主题和字体
  10. Sql serever的语句