2017-12-27 28 views
0

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); 

Antwort

0

fand ich heraus, was das Problem war, meine g_positions puffert Textur hatte das interne Format von GL_RGBA8 und das ist zu kleine Positionen in dem Weltraum

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,fbo->width,fbo->height,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL); 

so zu halten, wenn ich zu

geändert
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,fbo->width,fbo->height,0,GL_RGB,GL_FLOAT,NULL); 

Schatten erschienen: D

+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

+0

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