小IVan:专题概述及目录

灯光篇开篇概述:

灯光在游戏里非常重要,游戏画面的整体感觉,游戏运行的效率都和它息息相关。然而虚幻把这些逻辑封得死死地。各种概念和庞大的系统常常令人束手无策。本篇将从灯光光影的原理入手,先自己实现一些灯光再自己动手打光做效果,想必这样会事半功倍。

本小节将在虚幻中用蓝图脚本“手连”各种基础ShadowMap。感谢技术美术图形交流群的小伙伴们的共同探讨@。


最基础的ShadowMap

shadow map的原理网上一搜一大把。总的来说就是:“在灯光方向架一台摄像机,获取深度图,然后再正常渲染自己的场景,再在正常渲染场景的时候把fragment转换到光源空间,把它和之前渲染的Shadowmap中高度深度作比较,看它是否在影子里,如果是就返回0,不是就返回1”。上述就是最原始的shadow map了。下面就在虚幻中实现它吧。

首先创建几个资源


在BP_Light中创建一个SceneComponent和一个SceneCapture2D,然后设置它的参数,把RT_DepthMap设置给它。如图所示:


然后创建一个MaterialParamerterCollection


因为我们在材质里直接“连”我们的shadow map,但是在材质层拿不到视口矩阵和投影矩阵,所以我们自己构建我们的矩阵。矩阵的推导可以去看看龙书d3d11的shadow map那一章

首先在BP_Light的构造函数中,先把灯光的位置传进去


然后构造我们的灯光摄像机视口矩阵


然后是构造灯光摄像机投影矩阵


下面来设置我们的RT_DepthMap,精度越高影子效果相对来说会好些。


有了灯光位置和两个矩阵还有一张深度图,就可以开始在材质里做事情了。

在M_BasicObjectMaterial里,首先先把当前摄像机的像素位置变换到灯光摄像机空间


然后再变换到投影空间


然后再把它变换到【0-1】范围内


把深度图里的值(刚才渲染的)和它本身的值作比较。如果当前像素的摄像机方向上有遮挡,那么深度图里去除的值会比当前它的深度值小,如果小就说明此物体在阴影中。所以返回0

然后在场景里放两个模型,把灯光蓝图脚本拖进去,将会看到


调整材质中的bias值


你将会看到


但是这有个问题,就是影子的锯齿很严重。造成这个的原因是因为那个比较操作是离散的,是在影子里就是0,不是就是1。下面有很多方法来改进它。


PCF(percentage-closer filtering)

下面来对影子进行柔化处理。

对阴影周围进行范围采样然后取平均值,这样可以造出柔和的影子


可以看到影子的质量有明显提高,但是PCF缺点也很明显就是需要多重采样,而且效果上不符合物理规律。下面就来实现它吧。

来到M_BasicObjectMaterial里,我们对影子生成部分做如下修改

建一个CustomNode命名为PCF


CustomNode的代码如下


设置如下:


然后我们就可以得到柔和的影子了,如果想要更好的效果可以增加采样循环的次数。



PCSS(Percentage Closer Soft Shadow)


正常情况下,物体相距越远,影子会越弱越模糊,光源和半影成相似三角形,我们需要计算这个距离来动态改变我们PCF半影的半径。我的采样循环次数比较少所以看起来有点突兀。可以增大采样次数解决这个问题。


只需要修改M_BasicObjectMaterial种的CustomNode的代码即可。代码如下:



Irregular PCF

在PCF的基础上,对Offset做随机采样,可以得到更好的效果。


对M_BasicObjectMaterial的CustomNode做如下修改

代码:






还有CSM,VSM,ESM等后面的文章会来实现它们。

Enjoy it!


Next:

小IVan:虚幻4渲染编程(灯光篇)【第二卷:体积光】


【参考文章】

【1】cybercser/OpenGL_3_3_Tutorial_Translation

【2】阴影映射 - LearnOpenGL CN

【2】Softshadow with GLUT,GLSL and PCF

【4】https://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf

【5】https://blog.csdn.net/jc_laoshu/article/details/69657579

【6】投影矩阵的推导(Deriving Projection Matrices)

虚幻4渲染编程(灯光篇)【第一卷:各种ShadowMap】相关推荐

  1. unity scence灯光不显示_Unity渲染编程(灯光篇)【第二卷:MobileVolumetricLight】

    MY BLOG DIRECTORY: todo... INTRODUCTION: 如果需要一个方案来渲染城镇或空旷的马路上巨量的灯光.图形程序拿到这个需求直接开始搞F+或者延迟光照,但是对于移动端的巨 ...

  2. 虚幻4渲染编程(灯光篇)【第二卷:体积光】

    我的专栏目录: 小IVan:专题概述及目录 体积光在游戏里被越来越多地用到,对烘托场景气氛,提高游戏的逼格有比较重要的作用.这篇就来由浅入深研究一下这个东西.从容易的做法到高端做法依次递进. 首先先来 ...

  3. 虚幻4渲染编程(Pipeline篇)【第一卷:PBR Production Pipeline】

    我的专栏目录: 小IVan:专题概述及目录 简介: 当技术这边完成理论推导和研发后,需要为其配备一整套完整的落地方案,并且这套方案的成熟度,完善度和开发效率直接决定了产品的最后品质和公司的生产成本.随 ...

  4. 虚幻4渲染编程(光线追踪篇)【第一卷:光线追踪篇开篇综述】

    MY BLOG DIRECTORY: 小IVan:专题概述及目录​zhuanlan.zhihu.com INTRODUCTION: 什么都不说了先上个效果: 光线追踪云 电子游戏的光线追踪时代即将到来 ...

  5. 虚幻4渲染编程(游戏Demo篇)【第一卷:飞机大战】

    我的专栏目录: 小IVan:急速游戏开发综述及目录 概述: 技术美术需要对整个游戏制作流程都非常清楚,这样才能在开发中提出合理的制作方法.有时候有空可以自己做做游戏demo,这个过程也非常有趣.游戏D ...

  6. 虚幻4渲染编程(材质编辑器篇)【第三卷:正式准备开始材质开发】

    My blog directory: YivanLee:专题概述及目录 Introduction: 前面两章我们已经完成了对工具的研究,下面我们久正式开始启程啦!后面的内容可能就比较美术了. 还是老规 ...

  7. 虚幻4渲染编程(环境模拟篇)【第三卷:体积云天空模拟(3)---高层云】

    我的专栏目录: 小IVan:专题概述及目录 目前业内流行有两种体积云模拟的方式,模型+特殊shader法,RayMarching法.我前两篇文章已经对它们都做了介绍.当然还有些比较非主流的,比如粒子云 ...

  8. 渲染到ui_虚幻4渲染编程(UI篇)【第二卷:程序化UI特效-[1]】

    MY BLOG DIRECTORY: 小IVan:专题概述及目录​zhuanlan.zhihu.com INTRODUCTION: 当遇见某些特殊需求,比如对游戏效果有很多变化的要求,这时使用静态的贴 ...

  9. 虚幻4皮肤材质_虚幻4渲染编程(材质编辑器篇)【第六卷:各向异性材质amp;玻璃材质】...

    My blog directory: YivanLee:专题概述及目录​zhuanlan.zhihu.com Introduction: 各向异性材质 玻璃材质 材质编辑器篇的很多效果都非常简单,可以 ...

最新文章

  1. errors'MessageBoxA' : function does not take 1 parameter
  2. silverlight 入门教程(六)
  3. copy所有的java文件到硬盘_将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad...
  4. 【转】Linux中多线程wait使用注意
  5. Python稳基修炼之计算机等级考试易错细节题3(含答案)
  6. NGINX优化之路(一)
  7. wxml、wxss、js 引入外部文件的方法
  8. SFR算法详解(二)——斜棱法
  9. 常用CSS的命名规范:
  10. java ssh详解_JAVA SSH 框架介绍
  11. .axf文件_MDK 的编译过程及文件类型全解(一)
  12. 向jupyter notebook插入图片并控制大小和对齐方式
  13. 2022年R2移动式压力容器充装特种作业证考试题库及在线模拟考试
  14. 一个孩子的心愿(大冰,感动)
  15. 原生js实现拖拽效果,js拖拽原理
  16. hihocoder-1051,codeforces-884A(C语言+注释)
  17. 如何找回bilibili(b站)收藏夹里失效的视频?
  18. 尚医通 (三十一) --------- 手机登录
  19. 微信小程序input输入框密码的显示与隐藏
  20. 关系模式的完整性约束

热门文章

  1. Intellij IDEA 连接数据库(MySQL)详细过程
  2. linux运行input文件路径,new FileInputStream(filePath)方法在linux下执行不正确 | ZPY博客...
  3. 股市做空为什么会赔钱?
  4. Python制作游戏 — 贪吃蛇
  5. 作为程序猿 我们应该学会正确休息
  6. 基于CS结构的即时通信系统的设计与实现(QT开发)
  7. openwrt安装appfilter实现家长控制
  8. 单招计算机英语面试口语,单招面试英语自我介绍范文
  9. 详解js中的闭包(closure)以及闭包的使用
  10. C++宏函数和内联函数