Search Unity

One of the new features in Unity 5.5 is linear rendering on Android and iOS. With linear rendering, you’re sure that the inputs, the outputs and the computation are in the correct color space. The brightness of the final image will go linearly with the amount of light in the scene. That means more consistent lighting across your scenes and assets.

With the alternative, ‘Gamma’ Color Space, brightness will quickly begin to turn to white as values go up, which is bad for image quality – you can see an example below:

image01

With Unity 5.5, linear rendering is now available on Android and iOS. On Android, linear rendering requires OpenGL ES 3 graphics API which represents 61.1% of the Android devices. On iOS, linear rendering requires Metal graphics API which represents 71.1% of the iOS devices.

Due to the major differences between linear and gamma rendering, there is no fallback to gamma rendering because the assets would need to be reauthored. This means that a game using linear rendering won’t run on Android and iOS devices that only support OpenGL ES 2.0.

We rely on filters on Google Play to ensure that games, that uses linear rendering and couldn’t run properly on OpenGL ES 2.0 only devices, won’t be listed in Google Play. We proceed similarly on iOS relying on iOS Keys to filter linear rendering games on the iOS store.

Additionally, Unity 5.3 introduced support for the OpenGL ES graphics API in the Windows editor and standalone to improve mobile developers iteration time. We worked with a number of GPU vendors to enable linear rendering with OpenGL ES on Windows. This functionality is already available on GeForce 376.09 drivers, thanks to Piers Daniell from NVIDIA for his help.

To have a look at linear rendering, we made a simple test scene for mobile and desktop with correct assets that you can freely download here.

screenshot-2016-12-07-15-22-21

Currently, WebGL 2.0 doesn’t support linear rendering in Unity, but we have been working with the Khronos WebGL group and the Chrome team to provide such feature in a future release.

22 コメント

コメントの配信登録

コメント受付を終了しました。

  1. Ansgar Messmer

    12月 19, 2016 3:35 pm

    Hi there,

    I tried using the feature but my build keeps crashing as immediately when I click on the build-button.
    I build on a pc, player settings for iOS are as followed prepared:

    – Color Space: Linear
    – Auto Graphics API: unchecked
    – Graphics APIs: Metal
    – Target minimum iOS Version: 8.0

    Any ideas? Can I somehow

    1. Christophe Riccio

      12月 19, 2016 3:38 pm

      Erm, this is strange. Does it build when you switch back to gamma?

      I guess, I would recommend to create a bug report.

      Thanks

  2. So MacOS Metal supports that or not as Metal MacOS is very similar feature wise to Metal IOS?
    Also what about new 5.6 beta Vulkan support? supports linear rendering or will need some extension too?
    thanks..

    1. Christophe Riccio

      12月 16, 2016 2:32 pm

      Yes it’s supported with Vulkan and Metal on OSX

  3. What’s the reason for lack of linear in WebGL 2.0?

  4. Seeing dark halo’s around particles when using linear rendering for iOS. Is that an expected compromise?

    1. Christophe Riccio

      12月 16, 2016 11:53 am

      Does it render correctly on desktop?

  5. Alan Mattano

    12月 8, 2016 3:02 pm

    Is plan to change the default settings to linear (as default). And deferred! Or add a shortcut button while creating a new Project.

    1. Christophe Riccio

      12月 8, 2016 3:32 pm

      Not yet due to platform support but I wish!

  6. Why is the downloadable file not on the Asset store?

  7. warren miller

    12月 7, 2016 10:36 pm

    Does this mean Unity games make with 5.5 will only run on 61.1% of Android devices? It’s a bit ambiguous.

    1. You can always disable linear rendering on Android.

      1. Christophe Riccio

        12月 8, 2016 10:17 am

        Yes, you can still ship Unity games on OpenGL ES 2.0 devices using gamma rendering.

  8. Is there a performance difference between linear and gamma rendering and how big would that be for the provided example scene on various iOS and Android devices?

    I assume you did lots of performance tests while implementing linear rendering on those platforms, an overview of those results would be appreciated :)

    1. Christophe Riccio

      12月 8, 2016 10:28 am

      It very much depends on where is the performance bottleneck and this depends on GPU architectures too.

      However, generally speaking, our performance tests shown basically no performance differences. I think the better case was on iOS Metal shown some slight performance gain in linear thanks to the use of GPU hardware sRGB conversion (basically for free) instead of shader instruction to do sRGB conversions that we do sometimes in gamma mode.

  9. Pavel Kouřil

    12月 7, 2016 5:19 pm

    > With linear rendering, you’re sure that the inputs, the outputs and the computation are in the correct color space.

    But if you want the outputs in gamma, you have to use some color correction filter, right? Can it be done with the new PostProcessing stack?

    1. Christophe Riccio

      12月 7, 2016 5:38 pm

      If the framebuffer uses a sRGB format, in linear mode, the data will be outputted in sRGB but the computation and blending will still be performed in linear.

      So you don’t need a color correction filter for linear rendering to generate correct output.

      1. Pavel Kouril

        12月 7, 2016 11:56 pm

        And can you setup the framebuffer to use sRGB somehow? Or is it done by drivers and can’t be changed?

        Basically – the color corrected output from linear space looks “nicer”, but I’m afraid I might be doing the correction twice. How do I find out what space is being outputed?

        1. Christophe Riccio

          12月 8, 2016 10:45 am

          When you use linear rendering the conversions are done automatically. So, unless you are using custom shaders where you perform sRGB conversions, the output is correct by default. :)

        2. Pavel Kouril

          12月 8, 2016 12:07 pm

          Hmmm, so if I use a custom shader and don’t do any conversion, Unity will handle the output correctly? Or do I need to convert it in shader myself?

          The documentation is not clear in this case, IMHO. :/

      2. Christophe Riccio

        12月 8, 2016 1:27 pm

        Yes Unity will handle the conversion automatically.