I’m using the cginc file that performs plane clipping in shader. I’m looking for a way to add one property to the material using this shader, and then change the value of this property in the cginc file. However, I change the property within cginc, it doesn’t seem to be reflected in the material.
It’s part of the code I tried
plane_clipping.cginc
<code>#if USE_WORLD_BOUND
#define WORLD_BOUND_ENABLED 1
float4 _boundPlaneCenter[6];
float4 _boundPlaneNormal[6];
void WorldBound(float3 posWorld)
float dist1 = distanceToPlane(_boundPlaneCenter[0].xyz, _boundPlaneNormal[0].xyz, posWorld);
float dist2 = distanceToPlane(_boundPlaneCenter[1].xyz, _boundPlaneNormal[1].xyz, posWorld);
float dist3 = distanceToPlane(_boundPlaneCenter[2].xyz, _boundPlaneNormal[2].xyz, posWorld);
float dist4 = distanceToPlane(_boundPlaneCenter[3].xyz, _boundPlaneNormal[3].xyz, posWorld);
float dist5 = distanceToPlane(_boundPlaneCenter[4].xyz, _boundPlaneNormal[4].xyz, posWorld);
float dist6 = distanceToPlane(_boundPlaneCenter[5].xyz, _boundPlaneNormal[5].xyz, posWorld);
float isClipped = -getMinusOnlyIfAllAreMinus(dist1, dist2, dist3, dist4, dist5, dist6);
_IsClipped = step(0, isClipped); // If clipping is done, this value should be 1
#define SET_WORLD_BOUND(posWorld) WorldBound(posWorld);
#define SET_WORLD_BOUND(s)
#endif // PLANE_CLIPPING_INCLUDED
<code>#if USE_WORLD_BOUND
#define WORLD_BOUND_ENABLED 1
float4 _boundPlaneCenter[6];
float4 _boundPlaneNormal[6];
float _IsClipped;
void WorldBound(float3 posWorld)
{
float dist1 = distanceToPlane(_boundPlaneCenter[0].xyz, _boundPlaneNormal[0].xyz, posWorld);
float dist2 = distanceToPlane(_boundPlaneCenter[1].xyz, _boundPlaneNormal[1].xyz, posWorld);
float dist3 = distanceToPlane(_boundPlaneCenter[2].xyz, _boundPlaneNormal[2].xyz, posWorld);
float dist4 = distanceToPlane(_boundPlaneCenter[3].xyz, _boundPlaneNormal[3].xyz, posWorld);
float dist5 = distanceToPlane(_boundPlaneCenter[4].xyz, _boundPlaneNormal[4].xyz, posWorld);
float dist6 = distanceToPlane(_boundPlaneCenter[5].xyz, _boundPlaneNormal[5].xyz, posWorld);
float isClipped = -getMinusOnlyIfAllAreMinus(dist1, dist2, dist3, dist4, dist5, dist6);
_IsClipped = step(0, isClipped); // If clipping is done, this value should be 1
clip(isClipped);
}
#define SET_WORLD_BOUND(posWorld) WorldBound(posWorld);
#else
#define SET_WORLD_BOUND(s)
#endif
#endif // PLANE_CLIPPING_INCLUDED
</code>
#if USE_WORLD_BOUND
#define WORLD_BOUND_ENABLED 1
float4 _boundPlaneCenter[6];
float4 _boundPlaneNormal[6];
float _IsClipped;
void WorldBound(float3 posWorld)
{
float dist1 = distanceToPlane(_boundPlaneCenter[0].xyz, _boundPlaneNormal[0].xyz, posWorld);
float dist2 = distanceToPlane(_boundPlaneCenter[1].xyz, _boundPlaneNormal[1].xyz, posWorld);
float dist3 = distanceToPlane(_boundPlaneCenter[2].xyz, _boundPlaneNormal[2].xyz, posWorld);
float dist4 = distanceToPlane(_boundPlaneCenter[3].xyz, _boundPlaneNormal[3].xyz, posWorld);
float dist5 = distanceToPlane(_boundPlaneCenter[4].xyz, _boundPlaneNormal[4].xyz, posWorld);
float dist6 = distanceToPlane(_boundPlaneCenter[5].xyz, _boundPlaneNormal[5].xyz, posWorld);
float isClipped = -getMinusOnlyIfAllAreMinus(dist1, dist2, dist3, dist4, dist5, dist6);
_IsClipped = step(0, isClipped); // If clipping is done, this value should be 1
clip(isClipped);
}
#define SET_WORLD_BOUND(posWorld) WorldBound(posWorld);
#else
#define SET_WORLD_BOUND(s)
#endif
#endif // PLANE_CLIPPING_INCLUDED
ClippableLitURP.shader
<code>Shader "Universal Render Pipeline/Clippable Lit"
_IsClipped("Is Clipped", Float) = 0.5
// Add Properties to the Material
<code>Shader "Universal Render Pipeline/Clippable Lit"
{
Properties
{
...
_IsClipped("Is Clipped", Float) = 0.5
// Add Properties to the Material
...
}
...
}
</code>
Shader "Universal Render Pipeline/Clippable Lit"
{
Properties
{
...
_IsClipped("Is Clipped", Float) = 0.5
// Add Properties to the Material
...
}
...
}
And this function determines _IsClipped
TextureHandler.cs
private async Task AttachTexture(CancellationToken token)
renderers = gameObject.transform.GetComponentsInChildren<Renderer>();
foreach (var r in renderers)
if (r.sharedMaterial.HasProperty("_IsClipped") && r.sharedMaterial.GetFloat("_IsClipped") == 0)
materials = r.sharedMaterials;
// Do Something with non-clipped material
<code>...
private async Task AttachTexture(CancellationToken token)
{
renderers = gameObject.transform.GetComponentsInChildren<Renderer>();
Material[] materials;
foreach (var r in renderers)
{
if (r.sharedMaterial.HasProperty("_IsClipped") && r.sharedMaterial.GetFloat("_IsClipped") == 0)
{
materials = r.sharedMaterials;
// Do Something with non-clipped material
}
}
}
...
</code>
...
private async Task AttachTexture(CancellationToken token)
{
renderers = gameObject.transform.GetComponentsInChildren<Renderer>();
Material[] materials;
foreach (var r in renderers)
{
if (r.sharedMaterial.HasProperty("_IsClipped") && r.sharedMaterial.GetFloat("_IsClipped") == 0)
{
materials = r.sharedMaterials;
// Do Something with non-clipped material
}
}
}
...
But there’s nothing in the materials. I try Debug.Log and check the _IsClipped in the material, it was still initial value of 0.5.
Why is this not working properly? In my personal opinion, the shader code doesn’t affect the material properties as it works on all pixels. How do I work this out?