Single-Pass Stereo Rendering for HoloLens——HoloLens的单程立体渲染
原文网站:https://docs.unity3d.com/Manual/SinglePassStereoRenderingHoloLens.html
Single-Pass Stereo Rendering for HoloLens
HoloLens的单程立体渲染
There are two stereo rendering methods for Windows Holographic devices (HoloLens); multi-pass and single-pass instanced.
当前有两种针对windows全息设备(HoloLens)的立体渲染方法;多程渲染和单程渲染。
Multi-pass
Multi-pass rendering runs 2 complete render passes (one for each eye). This generates almost double the CPU workload compared to the single-pass instanced rendering method. However this method is the most backwards compatible and doesn’t require any shader changes.
多程渲染会完成两次完整的渲染过程(每只眼睛一次)。相比于单程渲染方法,这会导致将近两倍的 CPU工作量。然而这是向后兼容性最好的方法,并且它并不需要变更着色器。
Single-pass Instanced
单程渲染
Instanced rendering performs a single render pass where each draw call is replaced with an instanced draw call. This heavily decreases CPU utilization. Additionally this decreases GPU utilization due to the cache coherency between the two draw calls. In turn your app’s power consumption will be much lower.
To enable this feature, open PlayerSettings (menu: Edit > Project Settings > Player). In PlayerSettings, navigate to Other Settings, check the Virtual Reality Supported checkbox, then select Single Pass Instanced (Fastest) from the Stereo Rendering Method dropdown.
实例化渲染时,每执行一次渲染,每一个绘制调用会被替换成一个实例化渲染调用。这极大的减少了CPU的使用量,另外,如果两次绘制调用的内存关联性较大,这也会少量地减少GPU使用量。这样,你的程序的电量消耗也会变得更加的低,如果想使这个特性生效,打开PlayerSettings(菜单:Edit > Project Settings > Player)。在 PlayerSettings界面,找到Other Settings,勾选Virtual Reality Supported复选框,然后在Stereo Rendering Method 下拉框里选择Single Pass Instanced (Fastest)。
Unity defaults to the slower Multi pass (Slow) setting as you may have custom shaders that do not have the required code in your scripts to support this feature.
Unity的默认设置是较慢的Multi pass (Slow) ,是因为你能有一些自定义的shader不支持这项特性(single pass)。
Shader script requirements
着色器代码要求
Any non built-in shaders will need to be updated to work with instancing. Please read this documentation to see how this is done: GPU Instancing. Furthermore, you’ll need to make two additional changes in the last shader stage used before the fragment shader (Vertex/Hull/Domain/Geometry). First, you will have to add UNITY_VERTEX_OUTPUT_STEREO to the output struct. Second, you will need to add UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO() in the main function for that stage after UNITY_SETUP_INSTANCE_ID() has been called.
任何非内建的着色器都需要被更新来进行实例化工作。请阅读这个文档来了解如何去做:GPU实例化。此外,你将需要在片段着色器(Vertex/Hull/Domain/Geometry)之前,添加两个额外的变化在着色器的最后部分。首先,你将必须把UNITY_VERTEX_OUTPUT_STEREO 加到output结构体中。其次,你将需要添加UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO()到main函数里,这样,那个部分就会在UNITY_SETUP_INSTANCE_ID()之后调用
Post-Processing Shaders
后处理着色器
You will need to add the UNITY_DECLARE_SCREENSPACE_TEXTURE(tex) macro around the input texture declarations, so that 2D texture arrays will be properly declared. Next, you must add a call to UNITY_SETUP_INSTANCE_ID() at the beginning of the fragment shader. Finally, you will need to use the UNITY_SAMPLE_SCREENSPACE_TEXTURE() macro when sampling those textures. See HLSLSupport.cginc for more information on other similar macros depth textures and screen space shadow maps.
你将需要添加UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)宏到输入纹理声明的地方,这样2D纹理数组才能正确地被声明。然后,你必须在段着色器的开始添加一次UNITY_SETUP_INSTANCE_ID()的调用。最后,你将需要在取样那些纹理时使用theUNITY_SAMPLE_SCREENSPACE_TEXTURE()宏。你可以在 HLSLSupport.cginc里看到更多关于其他类似的宏深度纹理和屏幕空间阴影映射的相关信息。
Here’s a simple example that applies all of the previously mentioned changes to the template image effect:
这里是一个简单的案例,它应用了之前提过的改变,实现了一个样板图片特效。
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; UNITY_INSTANCE_ID }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; UNITY_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO }; v2f vert (appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_TRANSFER_INSTANCE_ID(v, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } __UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);__ fixed4 frag (v2f i) : SV_Target { UNITY_SETUP_INSTANCE_ID(i); fixed4 col = __UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); // just invert the colors col = 1 - col; return col; }
DrawProceduralIndirect
间接程序绘制
Graphics.DrawProceduralIndirect() and CommandBuffer.DrawProceduralIndirect() get all of their arguments from a compute buffer, so we can’t easily increase the instance count. Therefore you will have to manually double the instance count contained in your compute buffers.
Graphics.DrawProceduralIndirect()和CommandBuffer.DrawProceduralIndirect() 可以从一块计算缓存里获取所有的参数,所以我们不能简单的增加实例个数。因此你必须手动地加倍实例数量包括你的计算内存数量。
Vertex and fragment shader examplesSee the page for more information on shader code.
可以通过“顶点着色器和片段着色器例子”页面获取更多关于着色器代码的知识。
Single-Pass Stereo Rendering for HoloLens——HoloLens的单程立体渲染的更多相关文章
- [学习笔记]编译sensetime发表的Single View Stereo Matching(SVS)遇到的问题
最近在研究用深度学习预测图像深度信息的方法,一开始用的是2017年CVPR上Godard大神的monodepth,代码在这里.这篇文章介绍了利用双目的consistency训练网络以对单张图像进行深度 ...
- 立体渲染 Volumetric Rendering
基础概念 在3D游戏引擎中,球体.立方体以及所有其它复杂的集合体都是由三角面片组成的.引擎只会渲染物体的表面,比如球体,半透明物体等.整个世界由各种空壳构成. 立体渲染(Volumetric Rend ...
- unity3d Human skin real time rendering plus 真实模拟人皮实时渲染 plus篇
最近逃课做游戏,逃的有几门都要停考了,呵呵呵,百忙之中不忘超炒冷饭,感觉之前的人皮效果还是不够好,又改进了一些东西 首先上图 放大看细节 显而易见的比上次的效果要好很多,此次我把模型用3dmax进行了 ...
- Direct3D 11 Tutorial 2: Rendering a Triangle_Direct3D 11 教程2:渲染一个三角形
概要 在之前的教程中,我们建立了一个最小的Direct3D 11的应用程序,它用来在窗口上输出一个单一颜色.在本次教程中,我们将扩展这个应用程序,在屏幕上渲染出一个单一颜色的三角形.我们将通过设置数据 ...
- Unity3d 2017
Unity3d引擎的新纪元--Unity3d 2017 来源 http://blog.csdn.net/dark00800/article/details/75209544 Unity3d不久之前正式 ...
- Load store and memoryless
metal https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPractice ...
- 微软Hololens学院教程-Hologram 230-空间场景建模(Spatial mapping )【微软教程已经更新,本文是老版本】
这是老版本的教程,为了不耽误大家的时间,请直接看原文,本文仅供参考哦!原文链接:https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/ho ...
- HoloLens开发手记 - Unity之摄像头篇
当你穿戴好HoloLens后,你就会处在全息应用世界的中心.当你的项目开启了"Virtual Reality Support"选项并选中了"Windows Hologra ...
- Unity开发概览(HoloLens开发系列)
本文翻译自:Unity development overview 要开始使用Unity创建全息应用,点此安装包含Unity HoloLens技术预览的开发工具.Unity HoloLens技术预览基于 ...
随机推荐
- Java-反射初级知识掌握
PS:本文就Java基础需要掌握的反射知识做下汇总和分析. Java-reflect:java反射,对应我们研究框架.底层框架起到基本的知识储备. Class类Java的世界类,万事皆对象,所有的类都 ...
- VueI18n插件的简单应用于国际化
作为一个前端小白,刚刚接触学习Vue.js框架结合Element-ui组件开发项目.由于最近需要实现国际化功能,在看element-ui的开发文档时,只有简单的引入没有应用实例,对于我这种小白不能ge ...
- CCNA笔记(3)
网络类型 1,局域网 在一定范围的网络连接,只允许内部人员使用 2城域网 一个城市的网络连接在一起 3.广域网 一个省或者一个市的网络 所有的局域网加上广域网就是互联网
- CSS3中结构伪类选择器——root、not、empty、target选择器
1.root选择器 将样式绑定到页面的根元素中.根元素是指位于文档树中最顶层结构的元素,在HTML页面中就是指包含整个页面的<html>部分. <style type="t ...
- Awesome-Link——我的积累、推荐和分享
积累一些自己看过的比较好的技术博客.以后忘记了可以回过头来看,毕竟有些博客已经写的非常的好了.有些自己写的也会列举在上面.同时还包含一些好用的插件.工具.网站等等. github准备长期更新,欢迎st ...
- print与printf的区别
print与printf的区别 1,print 中不能使用%s ,%d 或%c: 2,print 自动换行,printf 没有自动换行. 纯粹做下笔记哈!很多东西不知道,也就只能这样了!
- HDU 1019 Least Common Multiple【gcd+lcm+水+多个数的lcm】
Least Common Multiple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- Prim最小生成树板子
普里姆算法可以称为"加点法",每次迭代选择代价最小的边对应的点,加入到最小生成树中.算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点. 邻接矩阵存图 时间复杂度O(n^2 ...
- Java学习之类的构建方法(函数)
在学习类的部分时,建立一个对象是这样建立的:(假设Person是类)Person p = new Person():我一直很费解为何new后面是一个函数形式, 今天学完构建方法后,才恍然大悟,豁然 ...
- UEP-多任务
打开多任务 Function testTabTask(){ openTabTask(","多任务测试",$$pageContextPath+"/componen ...