使用延期渲染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->方向是一个归一化的向量,因此我将其乘以常数以获取位置。

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 buffer

中拥有所有世界位置

我在递延片段着色器中的阴影计算:

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缓冲液中获得的值

这是我的深度纹理(我知道它会产生低质量的阴影,但我只想让它现在正常工作):

对不起,由于压缩,黑色污迹是树木...https://i.stack.imgur.com/t43ak.jpg

编辑:深度纹理附件:

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

我发现了问题是什么,我的g_positions buffers纹理具有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

相关内容

  • 没有找到相关文章

最新更新