• Unity
  • Sprite Shaders for Unity

Gah forgot your not on 5.5.
Is anyone else on 5.5? Can anyone confirm the normals work as expected for them?

It's possible that for some reason UNITY_REVERSED_Z isn't defined when using vertex lighting in 5.4 on android (thats the platform your running right?). That seems super weird / unlikely but running out of ideas.
If that is the case then that's a bug with Unity and not something I can really fix, I will try and check android on 5.5 at somepoint to make sure it's not a prob with that as well.

Related Discussions
...
ToddRivers wrote

Gah forgot your not on 5.5.
Is anyone else on 5.5? Can anyone confirm the normals work as expected for them?

It's possible that for some reason UNITY_REVERSED_Z isn't defined when using vertex lighting in 5.4 on android (thats the platform your running right?). That seems super weird / unlikely but running out of ideas.
If that is the case then that's a bug with Unity and not something I can really fix, I will try and check android on 5.5 at somepoint to make sure it's not a prob with that as well.

This implies you're going to support only the very latest unity version, that's a pity 🙁

Is the version shipped with the runtimes by Esoteric going to only support 5.5 as well?

In general we aim to officially support the latest version of each game toolkit. It nearly doubles our workload to also support the penultimate version. That said, unofficially the latest runtimes usually continue to work on recent previous versions of the game toolkits. There is also the option to freeze your runtime and editor versions.

Pharan wrote

@[삭제됨]
That seems right.
UNITY_REVERSED_Z is in the 5.5 documentation (https://docs.unity3d.com/550/Documentation/Manual/SL-BuiltinMacros.html)
but not in 5.4 (https://docs.unity3d.com/540/Documentation/Manual/SL-BuiltinMacros.html)

Yup, I don't know if it has any impact on the shaders, but with 5.5 (and I suppose starting from 5.5) the depth buffer is inverted.

From the ChangeLog:
"Graphics: Improve shadows precision for large game worlds. Use reverse-float depth buffer for improved depth buffer precision on modern GPUs. Particularly improves directional light shadowing for large view distances.​"
"Graphics: Added bool SystemInfo.usesReversedZBuffer to be able to know if the platform is using a "reversed" depth buffer."

Probably some useful info from the upgrade guide to 5.5:
https://docs.unity3d.com/Manual/UpgradeGuide55.html

Shaders: Z-buffer float inverted

The Z-buffer (depth buffer) direction has been inverted and this means the Z-buffer will now contain 1.0 at the near plane, 0.0 at the far plane. This, combined with the floating point depth buffer significantly increases the depth buffer precision resulting in less Z-fighting and better shadows, especially when using small near planes and large far planes.

Graphics API changes:

Clip space range is [near, 0] instead of [0, far]
_CameraDepthTexture texture range is [1,0] instead of [0,1]
Z-bias is negated before being applied
24 bit depth buffers are switched to 32 bit float format
The following macros/functions will handle reversed Z situations without any other steps. If your shader was already using them, then no changes needed from your side:

Linear01Depth(float z)
LinearEyeDepth(float z)
UNITY_CALC_FOG_FACTOR(coord)
However if you are fetching the Z buffer value manually you will need to do write code similar to:

float z = tex2D(_CameraDepthTexture, uv);
#if defined(UNITY_REVERSED_Z)
z = 1.0f - z;
#endif
For clip space depth you can use the following macro. Please note that this macro will not alter clip space on OpenGL/ES plaforms but will remain [-near, far]:

float clipSpaceRange01 = UNITY_Z_0_FAR_FROM_CLIPSPACE(rawClipSpace);
Z-bias is handled automatically by Unity but if you are using a native code rendering plugin you will need to negate it in your C/C++ code on matching platforms.

Unity 5.6: right is now left!

Nate wrote

Unity 5.6: right is now left!

Pretty much 😃

little update: on 5.4 vertex-lit shaders work correctly with (0,0,-1) also if you add a normal map (correctly lit from the front)

so, if I use either a normal map or rim lighting all is fine.
If the shader is flat and "simple", its lighting gets inverted.

Could this help to spot the issue? It's really weird the lighting is flipped only when there is not a normal map and there's not rim lighting activated.

I don't understand why Unity devs love to change sometimes names for code methods. It's like they love to mess projects up haha.

Anyways, I have a question. Is there a way to have the additive blending from Spine to work with your shaders @ToddRivers?
If I use additive blending in Spine that attachment doesn't work with your shaders. It would be awesome to combine both of them so I can animate lit things. Something I could do would be to animate the emissive power in your shaders to animate the lighting on my character, or something like that.

additive blending on the same shader is a premultiplied-alpha trick.
It probably will never work combined with various other lighting and shader features, so you may have to set a separate additive material specific to that slot/attachment. Note that this will necessarily break dynamic batching.

I think animating the Emissive Power property is fine. Are you not able to do that?

@Pharan what do you mean by setting a separate additive material specific to that slot/attachment? You mean inside Spine or in Unity?
Also I haven't tried to animate the emissive power yet so I can't tell if it works or not.

@Pharan doh! I didn't realise that. Yeah guess thats it... Its weird it works for Pixel-lighting though, both use the same function to work out normals direction so would expect both to be wrong.

@NeatWolf yeah its too much work to keep the latest version of the shaders working with multiple versions of unity. In general you can grab older revisions of the shaders that were built against older versions of Unity however yeah I'm not going to be trying to fix bugs for multiple versions of Unity at the same time. I'd try and push for your other assets to support latest Unity instead 😉
I am totally confused by why having a normal map or rim lighting makes it different, there's two functions calculateSpriteWorldNormal and calculateSpriteViewNormal in SpriteLighting.cginc that calculate the normals which is what effects the lighting.
The only thing of note in them is that UNITY_REVERSED_Z define that flips Z on certain platforms - rim lighting and normal maps shouldn't have any effect on it, plus there should be no difference between the two lighting modes.
Its all very strange!

You are on Android yeah? I am slightly scared it might be a weird android thing thats might still be there in 5.5. Need to check that!

ToddRivers wrote

Gah forgot your not on 5.5.
Is anyone else on 5.5? Can anyone confirm the normals work as expected for them?

It's possible that for some reason UNITY_REVERSED_Z isn't defined when using vertex lighting in 5.4 on android (thats the platform your running right?). That seems super weird / unlikely but running out of ideas.
If that is the case then that's a bug with Unity and not something I can really fix, I will try and check android on 5.5 at somepoint to make sure it's not a prob with that as well.

@[삭제됨]

Works for me on 5.5.0f3
I just tested (0,0,1) on vertex lit. But I can see it looks the same as your test :party:

Image removed due to the lack of support for HTTPS. | Show Anyway

Thanks for the continued support!

AlaNintendo wrote
ToddRivers wrote

Gah forgot your not on 5.5.
Is anyone else on 5.5? Can anyone confirm the normals work as expected for them?

It's possible that for some reason UNITY_REVERSED_Z isn't defined when using vertex lighting in 5.4 on android (thats the platform your running right?). That seems super weird / unlikely but running out of ideas.
If that is the case then that's a bug with Unity and not something I can really fix, I will try and check android on 5.5 at somepoint to make sure it's not a prob with that as well.

@[삭제됨]

Works for me on 5.5.0f3
I just tested (0,0,1) on vertex lit. But I can see it looks the same as your test :party:

Image removed due to the lack of support for HTTPS. | Show Anyway

Thanks for the continued support!

It looks like my situation but with (0,0,-1) normals in all three cases 😃

Anyway you're not targeting Android there, as I can see by looking at the window title.

Could you please test it by also switching the build platform to Android?

I tested again on Android (mobile phone) with the newest Shaders. Materials with PixelLit won't be rendered when its not a SpineObject. When i run it on desktop (android build) it's displayed and works correctly.

Hmm weird, is that only when using a Sprite Renderer? If you just apply that material to a quad is it the same / does it render?

Unity's own sprite system doesn't really like custom materials so could be something in that thats conflicting.

Guys, if you're using ToddRivers' version of the shaders and the latest spine-unity.unitypackage, make sure you delete the Sprites shaders in the Modules/Shaders folder. I'm not sure but their cginc files might conflict.

Yep, rendered on cube. I tested it again with 5.4 Unity, and there it works. So there must be something changed in 5.5

Anyone having problem working on mobile?

@dothem Hey so I just checked the shaders out on android and it all works for me ALTHOUGH - do check what your pixel light count is when running the game I reckon that will be whats making pixel lighting not work for you.

Go to Quality settings inside of Project Settings.
For each of the quality settings (Fastest/Fast/Simple etc) check the pixel light count.
If its zero then pixel lighting won't work, and you should use Vertex lighting instead. Less than 4 means less lights will effect objects than when using vertex lighting so it will look noticeably different.

Android /mobile tends to pick a faster quality setting than when you run the build on your PC so there might be lighting differences.
Vertex lighting is recommended for mobile because of this (its cheaper to do).
It would be nice to automatically switch shaders when pixel lighting is disabled but not sure there is.

Hey. I'm trying to use volumetric in my project.
I'm having difficulty with the imposition on the volumetric character.
Character appears transparent and looks nice smooth edges. Either the light is working properly, but the character at the same time gets rough edges.

I tried all the options of the shader settings could find. However, the ideal solution is not found.
Please help find a solution that will help to get smooth edges and realistic behavior of light.

The following video shows the essence of the problem.