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的工作, 也更为灵活和高效.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

小菜学Chromium之OpenGL学习之二

在这个教程里,我们一起来玩第一个OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架. 在C...

2996
来自专栏小鄧子的技术博客专栏

【译】占位图与渐变效果

我们甚至不用解释或者讨论:一个空的ImageView在视觉体验上真的很差,因为这是毋庸置疑的。如果你使用Picasso,你可能更倾向于通过网络连接来加载图像。依...

1092
来自专栏CreateAMind

Understanding Mutual Information and its Use in InfoGAN

0-8的生成数字的变化和之前文章中出现的结果类似:beta-VAE 实验:mnist多图及代码

851
来自专栏木宛城主

Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 1)

『可复用』这个词相信大家都熟悉,通过『可复用』的组件,可以大大提高软件开发效率。 值得注意的事,当我们设计一个可复用的面向对象组件时,需要保证其独立性,也就是...

2265
来自专栏SDNLAB

OFTest(四)-一种测试交换机流表下发速率的方法

引言:对于OpenFlow交换机,流表下发速率是一个非常重要的指标。虽然OpenFlow交换机的Spec定义了barrier_request和barrier_r...

3799
来自专栏哈雷彗星撞地球

Objective-C 中如何测量代码的效率背景

因此,我们不可避免的要用到一些方法来计算代码的执行效率。计算代码的执行效率可以使用的API有:

1185
来自专栏Android源码框架分析

Android硬件加速(二)-RenderThread与OpenGL GPU渲染

Android4.0之后,系统默认开启硬件加速来渲染视图,之前,理解Android硬件加速的小白文简单的讲述了硬件加速的简单模型,不过主要针对前半阶段,并没怎么...

5894
来自专栏程序员的知识天地

几个Python小案例,爱上Python编程!

Python是一种面向对象的解释型编程语言,源代码与解释器CPython遵守GPL协议,Python语法简洁清晰。

1862
来自专栏落影的专栏

OpenGLES进阶教程8-obj文件和mtl文件解析

教程 距离上一篇教程已经有两个月了,这两个月详细阅读GPUImage的源码,并写了详细解析,发现对OpenGLES的深入了解很有帮助。 上周一个简书的朋友问我...

4097
来自专栏FSociety

Python爬取京东Iphone X用户评论并绘制词云

目前京东商城只会展示商品的前100页评论,所以我们能爬取到的评论只有1000条。 不过如果区分下好/差/中评分别爬取的话,理论上应该能保存3000条评论。

1494

扫码关注云+社区

领取腾讯云代金券