c++ - 未渲染 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);
为什么我看不到场景中的阴影?
解决方案
推荐阅读
- python - 如何获取日期时间
- ethereum - 合约地址收不到 ETH
- git - 两个人可以在 Github 上放同一个 Repo 吗?
- python - 预测 LightFM 的负分
- visual-studio-code - 复制粘贴文本时,Visual Studio Code 不断添加输入?
- maven - 跳过“如果需要安装功能扩展”
- jquery - 使用 Laravel 按所选项目显示数据库中的图像
- linux - Linux - rsync 单一副本很好,但多个文件失败
- vue.js - 如何在 Vue.js/Vuetify 中创建警报消息队列?
- azure - “addon-http-application-routing-nginx-ingress-controller”的问题。未找到端点