[RELEASED] OmniShade - Mobile-Optimized Shader

OmniShade on the Unity Asset Store

Website | YouTube | WebGL Demo | Discord Support | Email
OmniShade is a highly performant shader designed for mobile devices. It is packed with a multitude of graphics techiques allowing it to achieve almost any look from realistic to toon to anime, yet also blazingly fast due to a progressive system of calculating only what it needs to for any setting.

It was designed to bridge the gap between Unity’s Standard Shader and mobile shaders, but can often look even better than desktop-class shaders due to its high level of stylization, combination, and customization.

All of the sample images above were rendered using only OmniShade. It can achieve almost any look, can be used for games with complex or simple lighting – regardless, the performance is always optimal. It is quite possibly the only shader you will need for your entire game.

Feature summary
All of the below can be used in any combination with optimal performance!

On top of this, you also get:

  • Built-In and URP pipeline support
  • Progressively adaptive performance
  • Set of demo scenes
  • Full source code, easily extendable

It’s true, the Standard Shader is still too slow for mobile devices. And let’s face it, giving an artist Shader Graph is like giving a baby a gun. But it doesn’t mean you have to settle for Diffuse shader.

1 Like

Great set of shaders. Bought it on sight.

What does Progressively adaptive performance mean?

Thank you!

It means the shader will compile into different variants depending on what features you enable.
So, if you only use Diffuse and Rim Lighting, a minimal shader will be generated just for that to run on the GPU. If you were to add Normal Map, a little more code will be generated and another shader will be made for that variation. It detects what you use, and always creates the minimal GPU code necessary for optimal performance.

This Shader makes even the editor faster! I’m loving it but developing for the Quest 2 and having issues when I run it. Seems like it’s only running in one eye and having clipping issues, did I mess something up? I am STOKED to use this Shader almost exclusively if I can figure out what my silly issue is lol thanks in advance!

Unfortunately I’ve never tested this shader on a VR device, although I’ve heard of one other person use it successfully in VR…

There are some depth and culling settings at the bottom of the shader which control the visibility.
I would start with those, like try set Culling to Off, Z Write to Off, Z Test to Always, and see if it makes a difference.

1 Like

Thanks for sharing that Ken.

Shader doesn’t support Single-Pass stereo rendering,
so if you have problems in VR, one thing to try is keep it on Multi Pass.

That’s a pretty big ask.

My current project is on multi pass at the moment because I use mirror shader that requires it. It’s not ideal and I have plans to change that.

Multipass is going to be a deal breaker for a lot of VR devs.

1 Like

Yes, I just released a patch to support Single Pass Stereo Rendering. Thanks for the suggestion!

2 Likes

WOW! Awesome thank you so much! going to test it now! SUPER STOKED!!!

… Works perfect THANK YOU AGAIN! :slight_smile:

Hi, could we have an option on the triplanar shader to use UV0 on the main texture? ( so make moss/snow/etc… with triplanar top ?)

After updating to lastest version I got this error :
Shader error in ‘OmniShade/Triplanar URP’: invalid subscript ‘viewReflectDir’ at Assets/Shaders/OmniShade/Shaders/OmniShadeCore.cginc(911) (on d3d11)

That’s a great suggestion, I’ll add support for using UV0 on the main tex in triplanar.
Also, thanks for the error report, will be fixed in the next patch, out later this week.

Hi, just updated and I now got 2 error on Standard URP :

Shader error in ‘OmniShade/Standard URP’: ‘reflect’: no matching 2 parameter intrinsic function; Possible intrinsic functions are: reflect(floatM|halfM|min10floatM|min16floatM, floatM|halfM|min10floatM|min16floatM) at Assets/Shaders/OmniShade/Shaders/OmniShadeCore.cginc(810) (on d3d11)
Shader error in ‘OmniShade/Standard URP’: undeclared identifier ‘adjNor_world’ at Assets/Shaders/OmniShade/Shaders/OmniShadeCore.cginc(810) (on d3d11)
Unity 2020.3.29 - URP 10.8.1

Thanks for the bug report, indeed you are correct!
I will have it fixed early next week.

In the meantime, you can workaround this by simply enabling the Diffuse, Rim Light, MatCap, or Specular feature, or remove the normal map and that should make the error go away.

Great thanks!

Really cool assets!
Hope you are bringing more of the “mobile features” like triplanar mapping and vertex swaying for vegetation, to the PBR version too :slight_smile:

Another cool feature would be tessellation… but I should stop dreaming now, haha.

Unity 2021.3.0f1
Android (for Oculus Quest 2)

I have updated my project from 2020.3 (which works fine) but when building the project I get the following error message. I have reimported the asset but still get the same message.

Shader error in ‘OmniShade/Standard URP’: undeclared identifier ‘Luminance’ at Assets/OmniShade/Shaders/OmniShadeCore.cginc(958) (on gles3)
Compiling Subshader: 0, Pass: Pass 3, Vertex program with BASE_SATURATION STEREO_MULTIVIEW_ON _DETAILBLEND_MULTIPLY _DETAILUV_UV1 _HEIGHTCOLORSBLEND_ALPHA_BLEND _LAYER1BLEND_ALPHA_BLEND _LAYER2BLEND_ALPHA_BLEND _LAYER3BLEND_ALPHA_BLEND _MATCAPBLEND_MULTIPLY
Platform defines: SHADER_API_GLES30 SHADER_API_MOBILE UNITY_ENABLE_REFLECTION_BUFFERS UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_LIGHTMAP_DLDR_ENCODING UNITY_NO_CUBEMAP_ARRAY UNITY_NO_DXT5nm UNITY_NO_FULL_STANDARD_SHADER UNITY_NO_RGBM UNITY_NO_SCREENSPACE_SHADOWS UNITY_PASS_META UNITY_PBS_USE_BRDF3
Disabled keywords: BASE_CONTRAST CUTOUT DETAIL DETAIL_CONTRAST DETAIL_LIGHTING DETAIL_VERTEX_COLORS EMISSIVE_MAP HEIGHT_COLORS HEIGHT_COLORS_TEX INSTANCING_ON LAYER1 LAYER2 LAYER3 MATCAP MATCAP_CONTRAST TRANSPARENCY_MASK TRANSPARENCY_MASK_CONTRAST UNITY_ASTC_NORMALMAP_ENCODING UNITY_COLORSPACE_GAMMA UNITY_ENABLE_DETAIL_NORMALMAP UNITY_ENABLE_NATIVE_SHADOW_LOOKUPS UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_LIGHTMAP_FULL_HDR UNITY_LIGHTMAP_RGBM_ENCODING UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_PBS_USE_BRDF1 UNITY_PBS_USE_BRDF2 UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_SPECCUBE_BLENDING UNITY_SPECCUBE_BOX_PROJECTION UNITY_UNIFIED_SHADER_PRECISION_MODEL UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_VIRTUAL_TEXTURING VERTEX_COLORS VERTEX_COLORS_CONTRAST _DETAILBLEND_ADDITIVE _DETAILBLEND_ALPHA_BLEND _DETAILBLEND_MULTIPLY_LIGHTEN _DETAILUV_UV2 _HEIGHTCOLORSBLEND_ADDITIVE _HEIGHTCOLORSBLEND_LIT _LAYER1BLEND_ADDITIVE _LAYER1BLEND_MULTIPLY _LAYER1BLEND_MULTIPLY_LIGHTEN _LAYER2BLEND_ADDITIVE _LAYER2BLEND_MULTIPLY _LAYER2BLEND_MULTIPLY_LIGHTEN _LAYER3BLEND_ADDITIVE _LAYER3BLEND_MULTIPLY _LAYER3BLEND_MULTIPLY_LIGHTEN _MATCAPBLEND_MULTIPLY_LIGHTEN

mthawley, thanks for the report. I think I found the problem and am submitting a patch for it.

If you rather not wati for the patch, you can fix it by simply deleting line 348 in OmniShade URP.shader

            #pragma shader_feature BASE_SATURATION

Excellent thanks!