Проблемы с использованием карты теней с отложенным рендерингом Opengl 3.3
Я пытаюсь реализовать простое отображение теней для проекта, над которым я работаю. Я могу визуализировать текстуру глубины на экране, чтобы я знал, что она есть, проблема в том, что, когда я пробую карту теней с координатами текстуры тени, кажется, что координаты выключены.
Вот мой световой расчет космической матрицы
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);
Я подправлю значения для размера и усеченности карты теней, но сейчас я просто хочу рисовать тени вокруг позиции игрока
the_sun->direction - нормализованный вектор, поэтому я умножаю его на константу, чтобы получить позицию.
player-> pos - позиция камеры в мировом пространстве
матрица проецирования света рассчитывается так:
mat4x4_ortho(lightProjMatrix,-SHADOW_FAR,SHADOW_FAR,-SHADOW_FAR,SHADOW_FAR,NEAR,SHADOW_FAR);
Вершинный шейдер теней:
uniform mat4 light_space_matrix;
void main()
{
gl_Position = light_space_matrix * transfMatrix * vec4(position, 1.0f);
}
Шейдер фрагмента тени:
out float fragDepth;
void main()
{
fragDepth = gl_FragCoord.z;
}
Я использую отложенный рендеринг, поэтому у меня есть все мои мировые позиции в буфере g_positions
Мой расчет тени в шейдере с отложенным фрагментом:
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;
}
Я называю функцию так:
get_shadow_fac(light_space_matrix * vec4(position,1.0));
Где позиция - это значение, которое я получил из выборки буфера g_position
Вот моя текстура глубины (я знаю, что она будет создавать тени низкого качества, но я просто хочу, чтобы она работала сейчас):
извините из-за сжатия, черные пятна - это деревья...
РЕДАКТИРОВАТЬ: Глубина текстуры вложения:
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);
1 ответ
Я выяснил, в чем проблема, моя текстура буферов g_positions имела внутренний формат GL_RGBA8, и он слишком мал для размещения позиций в мировом пространстве.
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,fbo->width,fbo->height,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
поэтому, когда я изменился на
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,fbo->width,fbo->height,0,GL_RGB,GL_FLOAT,NULL);
тени появились:D