Hi.
Sorry to bother you once again for a topix that I already ask a lot.
But I still can’t have my shadow to work well, and i’m out of idea.
I’ve try with the parallel split algorithm. ( idea from fabiom ( discourse.panda3d.org/viewtopic.php?t=5943))
It doesn’t seems to have improved.
I use only one directional light, on a pretty large world ( 20002000). Every mesh on this world is a cube ( 12 triangles) and can be small ( 222) to big(404040)
I’ve try to use very big shadow_map ( 40004000), change bias, use a lot of small cube instead of big one,…
I haven’t got any more idea on what can cause this, or what I’m doing wrong, so any idea is welcome.
since depth texture still crahs on some of the box here, I emulate this with shader and Standard texture.
The thing is…
have you got any idea of what I do wrong or what can cause this ?
( I know is more a general programming problem but,…)
shadow_caster:
light_depthmap = Texture()
light_depthmap.setFormat(Texture.FLuminance) # to store depth value instead of color
light_depthmap.setMinfilter(Texture.FTShadow) # to use OpenGL SGIX_shadow extension
light_depthmap.setMagfilter(Texture.FTShadow)
light_buffer = base.win.makeTextureBuffer('depthmap%i'%index, BUFFER_SIZE, BUFFER_SIZE, light_depthmap)
light_buffer.setClearColor(Point4(1,1,1,1))
light_cam = base.makeCamera(light_buffer)
light_cam.reparentTo(self.spotholder)
lens = OrthographicLens()
lens.setNearFar(100.0,max(self.world_size))
light_cam.node().setLens(lens)
light_cam.setPos(self.spotholder, 0,0,0)
light_cam.setHpr(self.spotholder, 0,0,0)
myShaderAttrib = ShaderAttrib.make()
shadowshader = loader.loadShader(pssm_caster%i.sha'%index))
standard_attrib = myShaderAttrib.setShader(shadowshader,1000)
standard_state = render.getState().addAttrib(standard_attrib)
light_cam.node().setInitialState(standard_state)
render.setShaderInput('shadow%i'%index, light_cam)
return light_depthmap, light_buffer, light_cam
shadow_receiver:
myShaderAttrib = ShaderAttrib.make()
shadowshader = loader.loadShader(ResourcePath('shader/pssm_receiver.sha').for_panda())
standard_attrib = myShaderAttrib.setShader(shadowshader,1000)
standard_state = render.getState().addAttrib(standard_attrib)
standard_state = standard_state.addAttrib(standard_attrib)
self.shadow_cam.node().setInitialState(standard_state)
#==
card_maker = CardMaker('')
card_maker.setFrameFullscreenQuad()
self.filter = NodePath(card_maker.generate())
self.filter.setTexture(self.shadow_map)
mycolorAttrib = ColorBlendAttrib.make(ColorBlendAttrib.MInvSubtract)
standard_state = self.filter.getState().addAttrib(mycolorAttrib)
self.filter.reparentTo(render2d)
self.filter.setBin('unsorted',50)
self.filter.setState(standard_state)
shaders:
//Cg
//Cg profile arbvp1 arbfp1
void vshader( float4 vtx_position : POSITION,
uniform float4x4 mat_modelproj,
in uniform float4x4 trans_model_to_clip_of_shadow0,
out float4 l_position : POSITION,
out float4 l_pos : TEXCOORD0
)
{
l_position = mul(mat_modelproj, vtx_position);
// scale matrix
float4x4 scaleBiasMatrix = {
0.5f,0.0f,0.0f, .5,//+0.0001,
0.0f,0.5f,0.0f, .5,//+0.0001,
0.0f,0.0f,0.5f, .5,
0.0f,0.0f,0.0f, 1.0f
};
float4x4 textureMat = mul(scaleBiasMatrix, trans_model_to_clip_of_shadow0);
l_pos = mul(textureMat, vtx_position);
}
void fshader( in float4 l_pos :TEXCOORD0,// POSITION,
out float4 o_color:COLOR)
{
o_color = float4(l_pos.z, l_pos.z, l_pos.z, 1);// color.w);
}
shader_receiver( 4 shadow_map)
void fshader(
in float4 l_position : TEXCOORD0,
in float4 l_shade0 : TEXCOORD1,
in float4 l_shade1 : TEXCOORD2,
in float4 l_shade2 : TEXCOORD3,
in float4 l_shade3 : TEXCOORD4,
// in float4 l_distance : TEXCOORD4,
in uniform float4 k_parallelesplit,
in uniform float4 k_bias,
in uniform sampler2D k_Ldepthmap0 : TEXUNIT0,
in uniform sampler2D k_Ldepthmap1 : TEXUNIT1,
in uniform sampler2D k_Ldepthmap2 : TEXUNIT2,
in uniform sampler2D k_Ldepthmap3 : TEXUNIT3,
out float4 o_color : COLOR )
{
float3 shadowUV0 = l_shade0.xyz / l_shade0.w ;
float3 shadowUV1 = l_shade1.xyz / l_shade1.w ;
float3 shadowUV2 = l_shade2.xyz / l_shade2.w ;
float3 shadowUV3 = l_shade3.xyz / l_shade3.w ;
float shadowTerm0 = 1 ;
float shadowTerm1 = 1 ;
float shadowTerm2 = 1 ;
float shadowTerm3 = 1 ;
shadowTerm0 = tex2D(k_Ldepthmap0, shadowUV0.xy).x ;
if (shadowTerm0 < l_shade0.z -k_bias[0] )
shadowTerm0 = 0.8 ;
else
shadowTerm0 = 1.0 ;
shadowTerm1 = tex2D(k_Ldepthmap1, shadowUV1.xy).x ;
if (shadowTerm1 < l_shade1.z - k_bias[1] )
shadowTerm1 = 0.8 ;
else
shadowTerm1 = 1.0 ;
shadowTerm2 = tex2D(k_Ldepthmap2, shadowUV2.xy).x ;
if (shadowTerm2 < l_shade2.z - k_bias[2] )
shadowTerm2 = 0.8 ;
else
shadowTerm2 = 1.0 ;
shadowTerm3 = tex2D(k_Ldepthmap3, shadowUV3.xy).x ;
if (shadowTerm3 < l_shade3.z - k_bias[3] )
shadowTerm3 = 0.8 ;
else
shadowTerm3 = 1.0 ;
float shadowTerm = shadowTerm3 ;
if (l_position.z < k_parallelesplit[2])
{
shadowTerm = shadowTerm2 ;
}
if (l_position.z < k_parallelesplit[1])
{
shadowTerm = shadowTerm1 ;
}
if (l_position.z < k_parallelesplit[0] )
{
shadowTerm = shadowTerm0 ;
}
o_color = float4(1-shadowTerm,1-shadowTerm,1-shadowTerm,1);
}