Untiy Native Render Plugin在VR中的绘制(二): 透明排序
时间:2022-05-16
本文章向大家介绍Untiy Native Render Plugin在VR中的绘制(二): 透明排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
上篇已经能在VR中画出来了, 但是还存在两个问题: 1. 透明物体会被Native画的东西挡住 2. VR中Native画的东西透视关系有点问题, 跟Unity绘制的场景不能很好地融合在一起
先来解决一个透明排序的问题, 这个问题有两个思路去解决:
双Camera
双Camera的思路就是, 一个Camera只画不透明物体, OnPostRender中回调Native Renderer, 另一个Camera只画透明物体. 这样Native的绘制就能在两者之间进行, 有几个细节:
- 先保证两个Camera的参数一样
- 第一个Camera的Culling Mask把TransparentFX去掉
- 第二个Camera的Culling Mask只保留TransparentFX
- 所有透明物体设置layer为TransparentFX
- 第二个Camera的Clear Flags设置为Don’t Clear, 这样两个Camera的画面才能结合到一起
- 第二个Camera的Depth设置成比第一个Camera大, 代表后画
插入CommandBuffer
Unity5.2在CommandBuffer入加入了调用NativeRenderPlugin的支持, 这就可以让我们可以在渲染管线的各个阶段之前插入我们想要的效果. 具体到我们的需求, 可以简化为:
private CommandBuffer commandBuffer;
void Start()
{
SetUnityStreamingAssetsPath(Application.streamingAssetsPath);
commandBuffer = new CommandBuffer();
commandBuffer.IssuePluginEvent(GetRenderEventFunc(), 1);
camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, commandBuffer);
GetComponent<MeshFilter>().mesh.bounds = new Bounds(Vector3.zero, Vector3.one * 1000);
}
void OnWillRenderObject()
{
// Set time for the plugin
SetTimeFromUnity(Time.timeSinceLevelLoad);
if (Camera.current != null)
{
var viewMatrix = Camera.current.worldToCameraMatrix;
var projectionMatrix = GL.GetGPUProjectionMatrix(Camera.current.projectionMatrix, VRSettings.enabled);
SetCameraMatrix(viewMatrix.toFloatArray(), projectionMatrix.toFloatArray(), VRSettings.enabled);
}
}
一个细节, OnWillRenderObject必须在有Mesh时才会调用, 所以这里挂了个Box到NativeRender的GameObject上, 并把包围盒设置成非常大, 一方面保证了SetCameraMatrix可以一直调用到, 另一方面也能”隐藏”掉这个Box(内部看经过back face culling是不可见的).
相对于双Camera的做法省去了为透明物体设置layer mask的工作, 也更为灵活和高效.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringCloud2020 学习笔记(九)cloud-consumer-order80 消费者订单模块入驻eurekaServer注册中心
- SpringCloud2020 学习笔记(十)cloud-eureka-server7001 cloud-eureka-server7002 Eureka集群安装
- Python爬虫之抓取某东苹果手机评价
- python学习笔记
- 必看!!!python列表( 增 删 改 查),超详细讲解!!
- Python识别验证码
- 多线程爪巴虫下载进击的巨人
- 利用selenium实现自动翻页爬取某鱼数据
- 20行Python代码爬取下载应用宝所有APP软件
- 爬虫 -- 天天基金网数据简单爬取
- python爬虫-唯品会商品信息实战步骤详解
- go框架中使用CGO,docker build image打包镜像注意事项
- python爬虫汽车之家全车型及基本参数入数据库(截止50524个数据)(详解)
- C语言最全入门笔记
- 如何实现oVirt与Tungsten Fabric的集成