首页 > 解决方案 > 未渲​​染 Qt 上的 OpenGL 多通道阴影贴图

问题描述

我正在尝试渲染从一些立方体上的点光源投射的动态阴影。然而,就像立方体上根本没有阴影一样,特别是在银色立方体上:

在此处输入图像描述

在我的程序中,我将 Qt OpenGL API 与本机 OpenGL API 一起使用。我做了两遍: 1. 创建深度纹理 (glGenTextures()),创建帧缓冲区 (glGenFramebuffers()) 并将纹理附加到该纹理 (glFramebufferTexture())。然后将所有立方体渲染到该帧缓冲区。2. 使用着色器中的纹理将所有场景渲染到屏幕上。我使用 QOpenGLShaderProgram 类来创建着色器程序。

我如何计算片段着色器中的阴影:

float isFragInShadow(vec3 fragPos)
{
    vec3 relFragPos = fragPos - lightPos;
    float closestDepth = texture(depth_map, relFragPos).r;
    closestDepth *= far_plane;

    float currentDepth = length(relFragPos);

    float bias = max(0.05 * (1.0 - dot(normalize(-relFragPos), Normal)), 0.005);
    float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;

    return shadow;
}

...

float isShadow = isFragInShadow(FragPos);
vec3 resColor = ambient * obj_material.ambient + (1.0 - isShadow) * (diffuse * obj_material.diffuse + specular * obj_material.specular);

我还尝试将深度纹理渲染到屏幕上,结果如下: https ://i.stack.imgur.com/qM9a1.png

我如何渲染:

vec3 lightToFrag = FragPos - lightPos;
float closestDepth = texture(depth_map, lightToFrag).r;

Color = vec4(vec3(closestDepth), 1.0);

为什么我看不到场景中的阴影?

标签: c++qtopenglglsl

解决方案


推荐阅读