Skip to content

BotsOP/ColoredShadowsUnity

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

77 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Colored Shadows Documentation

What is it

ColoredShadows is a library to be used together with shadergraph to easily create customized shadows inside of Unity URP.

Guides

Setup

After you have imported the core library go to your Universal Render Pipeline Asset (in a new project located under “Settings/PC_RPAsset”). Click on the plus icon on the renderer list located at the top and add the ColoredShadow URD asset.

To test if it works, open the SampleColShadowScene in the sample folder.

Making a custom shadow

Set the _ShadowID on the object casting a shadow to something above 1 (preferably whole numbers).

Make a new shader for the floor and add the “SampleColShadow_With_UV_ObjectSize” to the shadergraph. And connect the ShadowID value to the color. The _ShadowID value you set on the cube is the ShadowID value you get from the SampleColShadow shader graph node in the floor shader.

After having set the ShadowID to the base color you should now see something like this. If you set the _ShadowID on the cube to 0.5 you should see the shadow gets darker and if you set it to 1 it should be fully white.

Now add a second cube and give it a copy of the material of the cube and give it a _ShadowID of 2.

To give both cubes a differently colored shadow we use the _ShadowID set on the cube as a mask to differentiate between the two shadows. We check if the ShadowID given to use by the SampleColShadow node matches with our ShadowID values set on the cubes. We use a comparison node to give us a mask that is 1 for the object's shadow that has a matching ShadowID. Then we multiply it with whatever color we want.

You should now see something like this if you set _ShadowID values on the cube to a 1 and a 2.

![][image8]

To set the color for the rest of the material we use the mask value given to us from the SampleColShadow node and a lerp. The mask value is a 1 everywhere a shadow is and 0 where there is none. We use a lerp where in the A slot is our generic floor texture, in the B slot is our custom shadow, and in the T is our mask which we use to blend the 2 together. We can also multiply the mask with for example 0.5 to get a softer blend between the floor and shadows.

![][image9]

We should now see our floor texture blended with our custom shadows.

![][image10]

Adding an animated offset

To add an animated offset we use the UVOffset or PosOffset on the SampleColShadow shader node in the floor shader.

![][image11]

For this example I used the PosOffset and created a simple scrolling noise texture that I plugged into the PosOffset. You should see your shadows now moving in waves across the floor. To learn the nuances between UVOffset and PosOffset refer to the documentation.

![][image12]

The result

![][image13]

Adding textures to shadows

We start by adding a ShadowUV node and plugging ShadowUV, ShadowSize, LightUV into the ShadowUV like the example below.

![][image14]

Then we plug the generated UV’s into a texture sample node and plug that into our mask.

![][image15]

Our texture is mapped but the uv size is incorrect so our texture gets repeated. To fix this we need to change the ShadowUVMultiplier variable on the ShadowUV node.

![][image16]

After having set the ShadowUVMultiplier value to 3 and adding a sampler set to clamp on the texture sample node we get our desired result.

![][image17]

Multiple different shadows per object

We start with 2 custom lights both casting a shadow on the cube.

![][image18]

We set the “Add To Shadow ID” on the custom light component to 1.

![][image19]

The ShadowID from the SampleColShadow node in the floor shader is the _ShadowID from the cube plus the “AddToShadowID” value from the custom light. So because we set the cube _ShadowID to 1 and the “AddToShadowID” to 1 our ShadowID in the floor shader is 2 (because they both get added to each other 1 + 1 = 2). And this is what our final shader looks like. The shadow cast from the custom light with an “AddToShadowID” of 0 casts a shadow with ShadowID of 1 (1 + 0 = 1) which becomes red, and the shadow cast from the custom light with an “AddToShadowID” of 1 casts a shadow with ShadowID of 2 (1 + 1 = 2) which becomes blue.

![][image20]

Final result.

![][image21]

Spawning particles on shadows

First make sure you have the Visual Effect Graph package installed. Enable the “Enable VFX Support” in the custom light component. This adds 2 passes which generate a buffer filled with the world positions of the shadow (this does create extra performance so turn it off if you are not using vfx.

![][image22]

Add a new layer and add it to the object casting the shadow.

![][image23]

Then deselect that layer in the Shadow Receiving layermask.

![][image24]

Create a VFX effect and create a “_Shadowpositions” graphics buffer and a “_ShadowPositionsCount” int.

![][image25]

Add the “Sample Shadow_Subgraph Operator” node and plug the _ShadowPositions and _ShadowPositionsCount variable into the node.

![][image26]

After setting up the VFX graph add it to the “Visual Effects” list in the custom light component so that the buffer and count get updated.

![][image27]

Here is a simple example to test if it’s working

![][image28]

If you did everything correctly you should now have something similar to the image below.

![][image29]

Custom Light

![][image30]

Light Index

Dictates where it should write it’s data to for example if you want to access the shadow map directly you can input the _ColoredShadowMap(Light Index) as a Tex2D and read it’s values. The writing and managing is handled by the system and should not be changed by the user.

Light Mode

Changes the type of light. A directional light casts each shadow as if it was really far away (for example our sun) so that each light ray is parallel to each other. A spot light casts the light like it was a flashlight. The light comes from a single point and spreads outwards. A point light casts light in all directions all around itself.

Farplane

The near and far plane control what gets rendered. For example the far plane is set to 50 units and an object is further than 50 units away it wouldn’t cast a shadow.

On the left the object is inside farplane radius thus the shadow gets rendered. On the right it is outside the farplane radius so it doesn’t get rendered.

Size

This setting is accessed by setting the light mode to directional. It allows you to set the size of the area that light that it captures

The size on the left isn’t big enough to capture all of the shadows casting objects.

FOV

This setting is accessed by setting the light mode to spot. It changes how spread out the light will be, a higher fov will cause it to cast light on a wider area, and a lower fov will make it narrower.

The fov on the left isn’t big enough to capture all of the shadows casting objects.

Aspect Ratio

This setting is accessed by setting the light mode to spot. It allows you to change the aspect ratio for if you want to cast a more vertical or horizontal light.

Radius

This setting is accessed by setting the light mode to point. It controls like the far plane up to what distance objects get rendered into the shadow map, but this time it’s an AABB cube the size of radius.

Falloff Range

Sets the fall off range where shadows should fade out.

Add Shadow ID

This adds the value to the shadow id on the object casting the shadow. This lets you have the same object cast different shadows. In the setup below the object has a shadow id of 1 and one of the lights has an Add Shadow ID of 10 so in the shader the red shadow is linked to a shadow id of 1 and the blue shadow is linked to a shadow id of 11.

Shadow Texture Size

the texture size of the shadow map in pixels. More pixels mean less jagged edges.

Override Shader

The override shader used when capturing the shadow. This lets you change what information about the object gets stored in the shadow map.

Shadow Casting Mask

Objects that can cast and receive shadows.

Custom Values

These values get passed along to the shadows that this light casts. The maximum amount of custom values you can have is 12.

Enable VFX Support

This enables 2 passes that add support for the vfx graph. This renders the scene again from the lights point of view so if you are not using the vfx graph this setting should be disabled.

VFX Sampling Size

This controls how many points are sampled from the shadow map and how big the buffer should be. Changing this value recreates the buffer so it should not be changed often when the game is running. The size of the buffer is calculated by multiplying the value by itself, so with the input 256 the buffer size becomes 256 * 256 = 65536. This setting allows you to downsample the shadow map for particles since you usually don't need to sample every pixel. So if you set this value to 256 and your shadow map is 2048 then only every 8th pixel gets sampled, reducing the buffer size by 8 and doing 8 times less calculations.

VFX UV Size

Adjust the size of the uv correctly to control how big or small the sampled texture should be.

VFX Relative UV Size

If you set a constant shadow size instead of the one given to you by the “Sample Colored Shadow” node you can get independently sized textures (top) instead of it being relative to the shadow size (bottom).

Indepent size

![][image31]

Relative size

![][image32]

VFX Shadow Receiving Mask

Objects that should receive shadows. Objects that cast shadows should be excluded from this list as it would give incorrect results for the VFX world positions. This mask is only used for generating the VFX buffer.

Visual Effects

This is a list of all the visual effects that you want to have access to the shadow map world positions. The Visual Effect Graph should have a graphics buffer called “*ShadowPositions” and an int called “*ShadowPositionsCount”.

Sample Colored Shadow Node

![][image33]

UV Offset

Float2 value that gets added to the shadow mapped uv before sampling the shadow map. If you are using point lights you should use position offset. Because the value gets added after getting the light space uv’s the offset you add is relative to the rotation of the light. So if you want to offset the shadow closer to the light, adding to the Y/V component of the uv offset ensures the shadow always goes closer to the light source (shown in the third image).

No offset for reference

Adding 0.1 to the x of uv offset moves it perpendicular to the light direction.

Adding 0.1 to the y of the uv offset moves it closer to the light source.

Position Offset

Float3 that gets added to the world position before calculating the shadow mapped uv. Because this offset gets added to the world position before any calculations the offset is in world space and not relative like uv offset.

![][image34]

No offset for reference

![][image35]

X offset of 1 moves it diagonally upward relative to the light direction.

Shadow UV Size

Adjust the size of the uv correctly to control how big or small the sampled texture should be.

Relative UV Size

If you set a constant shadow size instead of the one given to you by the “Sample Colored Shadow” node you can get independently sized textures (top) instead of it being relative to the shadow size (bottom).

Indepent size

![][image31]

Relative size

![][image32]

Shadow ID

The value set on the shadow casting object plus the “Add Shadow ID” value from the custom light.

Shadow UV

The origin of the shadow casting object converted to screen space. Essentially the uv coordinate of the origin on the shadow map. Used for mapping textures on a shadow.

Shadow Size

The distance between the min world bounds and the max world bounds of the shadow casting object. Used to keep textures mapped to a shadow to stay relative to the shadow size since it’s a rough estimate of the shadow size.

Light UV

The uv coordinate used to sample the shadow map. Used for mapping textures on a shadow.

Light Position

Position of the custom light that cast the shadow being sampled.

Falloff Range

The distance relevant to the light position and the max falloff value. 1 being the light position and 0 being on the edge of the falloff range.

Mask

Used to blend the shadows with the material.

Custom Output 1/2/3

The custom output values from the lights custom values. The values are compacted into 3 float4 so the first value is in the customOutput R channel and the 7th custom value is in the second customOutput B channel.

Limitations

You can’t have more than 10 custom lights in a scene (limit will be increased dramatically before release). Point lights can't have a texture size larger than 2730 because each face gets put next to each other so 2730 * 6 = 16380 and our limit is 16k textures which are 16384 maximum.

[image8]: <data:image/png;base64,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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published