基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十九)阴影映射 ShadowMapping

Vries的教程是我看过的最好的可编程管线OpenGL教程,没有之一,其原地址如下,https://learnopengl-cn.github.io/05%20Advanced%20Lighting/03%20Shadows/01%20Shadow%20Mapping/ 关于阴影映射的详细知识了解请看原教程,本篇旨在对Vires基于visual studio平台的编程思想与c++代码做纯Qt平台的移植,代码移植顺序基本按照原教程顺序,并附加一些学习心得,重在记录自身学习之用

Tip1: 移植问题很多!主要集中在使用帧缓冲深度图上,考完后详细叙述。

Tip2: 考试月,文字部分待续,请先看Vries的。先传程序。

 

程序源代码链接:https://pan.baidu.com/s/1uFNFVY2LtrOOLoZbE_-HHg 提取码:mlao 

编译环境:Qt5.9.4

编译器:Desktop Qt5.9.4 MSVC2017 64bit

IDE:QtCreator

 

一. 程序简介

    分别用QOpenGLFunctions_3_3_Core与QOpenGLFrameBufferObject两种方法生成深度图,第一种是Vries所使用的OpenGL的原生函数,第二种是Qt自身对OpenGL的包装函数,两种方法各有利弊。

程序可以具有三个功能

  1. 查看深度贴图
  2. 查看场景阴影
  3. 调整光源方向

 

                 图1 core原生函数生成深度图                                      图2 QOpenGLFrameBufferObject生成的深度图

 

           图3 core原生函数生成深度图                                      图4 QOpenGLFrameBufferObject生成的深度图

   

  使用QOpenGLFrameBufferObject生成的深度图在这个光照方向下有一条明显的黑色条纹带,这可能是因为QOpenGLFrameBufferObject 自带的纹理样式,没有深度部件 GL_DEPTH_COMPONENT,也就是原生函数

所以,如果我使用QOpenGLFrameBufferObject技术,就必须使用在深度贴图的着色器里,强制将片段深度输出,如下面代码所示。所以两种技术生成的深度图在 projection投影矩阵之外的部分,默认填充颜色是不一样的,core是白色,QOpenGLFBO是黑色。


#version 330 core
out vec4 FragColor;

void main(){             
//  gl_FragDepth = gl_FragCoord.z;
//        gl_FragDepth = 0.3;
  FragColor = vec4(vec3(gl_FragCoord.z), 1.0f);

}

 

  但如果我们将光源方向稍微做一下改变,QOpenGLFrameBufferObject生成的阴影映射又正常了。

  PS:Vries在阴影着色器里算光源位置时,用的是片段到光源位置的矢量,也就是点光源的计算方法,但是深度图确是采用ortho投影计算的,这样与现实不符合。 

现实中来讲,应该是

perspective投影生成的深度图对应点光源的阴影计算,

ortho投影生成的深度图对应平行光源的阴影计算,

我尝试将ortho矩阵换成perspective矩阵,阴影又会出现一堆乱七八糟的效果,调起来好麻烦,想必Vries当年做到这一步时,也是嫌麻烦不想再做了吧,于是直接用ortho矩阵。笑哭 ?

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值