PCF shadow using rendertexture
Hello everyone !
I'am almost done creating a custom shadowmap but im stuck at the pcf filtering part.
Im using a RenderTexture to create a DepthMap using the format RFloat instead of depth or ShadowMap to have full control over it, I might do some anti-aliasing and other stuff in the future to that map.
I kind of wasted two days already by searching to fix this specific case so you are my last resort, I would be really thankful if you could guide me.
The first issue I found is that the depth scale doesn't match between unity's automatic shadowmap format and mine, my depth is calculated in the vertex shader by doing so:
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.depth = max(UNITY_NEAR_CLIP_VALUE, o.pos.z);
and the fragment outputs
return o.depth;
which will then be rendered in the RenderTexture to create the depthmap.
Here's how the depth is being rendered on screen before shadow/depth comparison :
return depthTextureName.Sample(samplerDepthTextureName, uv.xy).r;
And here's how it looks like:
https://imgur.com/2rckudy
If I then do a standard comparison like so :
float depth = depthTextureName.Sample(samplerDepthTextureName, uv.xy).r; return depth < uv.z ? 0.0 : 1.0f;
The shadowmap format will be entirely white, my RFloat will render shadows with hard/pixelated/non-interpolated edges.
.
Now if I do a comparison sampling to get pcf shadow
return depthTextureName.SampleCmpLevelZero(samplerDepthTextureName, uv.xy, uv.z);
The Shadowmap format renders shadows correctly with PCF and the not-so-welcome shadow acne but, my RFloat is completely dark and here's where the second thing comes in:
It doesn't matter what I input into the depth comparison (uv.z) of SampleCmpLevelZero, using a float controlled through the inspector didn't change anything at all so it might come from the SamplerComparisonState that unity fills automatically once you pass a RenderTexture to a shader, I think I need "ComparisonFunc = LESS;" but setting it in shader doesn't actually apply it, it's probably overwritten when sending the rendertexture from c# to the shader.
So, to recap :
1. How should I scale my depth texture to be able to use SampleCmpLevelZero ?
2. How can I Fill the SamplerComparisonState to be able to use the RFloat texture format with the SampleCmpLevelZero ?
Your answer
Follow this Question
Related Questions
Why setting RenderTextureFormat to Depth freezes unity dead, if i try to preview it in inspector? 0 Answers
How can I use the depth of the Kinect for my overlayObject ? 0 Answers
[System.Serializable] ruins my code? 0 Answers
create Render Textures at runtime 1 Answer
RenderWithShader result is all black 0 Answers