Ich versuche, einfache Shadow-Mapping für ein Projekt, an dem ich arbeite, zu implementieren. Ich kann die Tiefe Textur auf dem Bildschirm rendern, so dass ich weiß, dass es da ist, das Problem ist, wenn ich die Shadow Map mit den Schatten Textur Koordinaten Sample, als ob die Koordinaten aus sind.Probleme mit der Verwendung einer Shadow-Map mit verzögertem Rendering Opengl 3.3
Hier ist meine Lichtraummatrix Berechnung
mat4x4 lightViewMatrix;
vec3 sun_pos = {SUN_OFFSET * the_sun->direction[0],
SUN_OFFSET * the_sun->direction[1],
SUN_OFFSET * the_sun->direction[2]};
mat4x4_look_at(lightViewMatrix,sun_pos,player->pos,up);
mat4x4_mul(lightSpaceMatrix,lightProjMatrix,lightViewMatrix);
Ich werde die Werte für die Größe und Stumpfes der Schattenkarte zwicken, aber ich will jetzt nur Schatten um den Spieler Position ziehen
Die_Sonne-> Richtung ist ein normalisierter Vektor, also multipliziere ich ihn mit einer Konstanten, um die Position zu erhalten.
player-> pos ist die Kameraposition im Welt-Raum
die Lichtprojektionsmatrix wie folgt berechnet wird:
mat4x4_ortho(lightProjMatrix,-SHADOW_FAR,SHADOW_FAR,-SHADOW_FAR,SHADOW_FAR,NEAR,SHADOW_FAR);
Schattenvertexshader:
uniform mat4 light_space_matrix;
void main()
{
gl_Position = light_space_matrix * transfMatrix * vec4(position, 1.0f);
}
Shadow-Fragment-Shader:
out float fragDepth;
void main()
{
fragDepth = gl_FragCoord.z;
}
ich latenten bin mit Rendering so dass ich meine Welt alle Positionen haben in den g_positions Puffer
Mein Schatten Berechnung der latenten Fragment-Shader:
float get_shadow_fac(vec4 light_space_pos)
{
vec3 shadow_coords = light_space_pos.xyz/light_space_pos.w;
shadow_coords = shadow_coords * 0.5 + 0.5;
float closest_depth = texture(shadow_map, shadow_coords.xy).r;
float current_depth = shadow_coords.z;
float shadow_fac = 1.0;
if(closest_depth < current_depth)
shadow_fac = 0.5;
return shadow_fac;
}
nenne ich die Funktion wie folgt:
get_shadow_fac(light_space_matrix * vec4(position,1.0));
Wo Position der Wert i aus Abtasten des g_position Puffer bekam ist
Hier ist meine Tiefe Textur (ich weiß, es niedrige Qualität Schatten produzieren wird, aber ich möchte nur, um es für die jetzt in Betrieb):
leider wegen die Kompression, die schwarzen Flecken Bäume sind ... https://i.stack.imgur.com/T43aK.jpg
EDIT: Tiefe Textur attachment:
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT24,fbo->width,fbo->height,0,GL_DEPTH_COMPONENT,GL_FLOAT,NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, fbo->depthTexture, 0);
speichert Weltraum Postition in einem gbuffer ist eine riesige Verschwendung von Speicherbandbreite.Alles, was Sie brauchen, ist Fensterplatz z (der Tiefenpuffer, den Sie sowieso benutzen), Sie können leicht zurück in den Weltbereich projizieren. – derhass
Huh, ich habe etwas darüber gelesen, während ich erforscht habe, wie ich das Problem lösen kann, habe aber nie darüber nachgedacht. Danke für die Erwähnung, ich werde es so bald wie möglich implementieren. – Gicla