水面效果-2
前言 在之前的文章,我们已经结合了反射纹理和折射纹理,有了一个初步的水面效果了。今天这篇文章我们会继续深入,优化水面的效果。 菲涅尔现象 如果你对基于物理的渲染管线(PBR)比较熟悉的话,那很有可能你已经知道菲涅尔现象(Fresnel Effect)是什么了。简单的来说,当光线照射到两种不同介质(例如从空气照射到玻璃或者从水照射到空气)的分界面时,一部分光会被反射,一部分光会折射进入另一种介质。菲涅尔反射描述了反射光和折射光的比例与光线入射角之间的关系。 根据菲涅尔方程(Fresnel equations),反射率会随着入射角的变化而变化。当光线垂直(入射角为 0°)入射到界面时,反射率是一个固定的值;而当入射角增大时,反射率会逐渐增大。当入射角接近 90°(掠射角)时,反射率趋近于 1,几乎所有的光都会被反射。 在渲染水面时,当视线垂直于水面,可以看到水下一定的深度,此时光大部分折射进入水中,反射的较少。但当视线与水面夹角很小时(接近平行于水面看),水面就像一面镜子,反射很强。这就是菲涅尔现象在起作用。 下面的两张截图表现了这个效果。 那么该如何实现这种效果呢,很简单,在渲...
水面效果-1
前言 在经过了逐步的迭代,KongEngine中已经接入了不错的地形和体积云效果(体积云的相关文章我还在整理计划当中,打算后续和IBL连着一起写),所谓好山好水好风光,有了山和云,接下来我的计划便是将水的渲染纳入KongEngine的能力中。 水面的渲染 下面我们来介绍如何实现一个简单的水面渲染效果。 水面渲染的构成 水面的渲染主要由两部分构成:反射和折射,分别对应着水面之上和之下的内容。我在之前已经有文章分享过屏幕空间反射(SSR)的实现细节,但是对于水面来说,反射的范围一般来说是会更大的,包含的内容也会更多。如果仅仅是只能反射屏幕空间的内容的话渲染效果其实并不理想,因此对于水面我们这里使用另外一种方式来实现反射效果。 基础能力 为了实现水面的渲染,需要下面几个基础能力的帮助。 帧缓冲对象(Framebuffer Objects) 在实现前面的很多渲染效果的过程中,我们多次使用了帧缓冲对象,应该对这个很了解了。我们使用的延迟渲染技术就和帧缓冲对象是分不开的。 如果不熟悉这个的同学可以去翻看一下前面的文章,简单的来说帧缓冲对象能让我们将场景内容渲染到它上面,经过处理后再输出到屏...
浅谈数字人仿真的渲染技术(四)
前言 这篇文章是我在OGEEK上做过的《浅谈数字人仿真的渲染技术》分享的最后一部分,这一部分的内容主要包含的内容是**非真实感渲染(Non-photorealistic Rendering, NPR)**技术,通常这项技术会被用在渲染卡通风格的内容。 非真实感渲染 前面的渲染技术一般都是用于高真实度数字人的渲染,接下来我们来介绍一下NPR。 什么是NPR NPR,我们一般指的是非真实感渲染(Non-photorealistic Rendering),它是相对于**真实渲染(Photorealistic Rendering)**的。 真实感渲染的目的在于渲染出照片级别的高真实度画面;而非真实感渲染,他的目的多种多样,它可以模拟艺术化的绘制风格,呈现出手绘的效果。 这是游戏”犬神“的画面,它的渲染模拟出一种独特的水墨风格。 这是游戏”荒野之息“的画面,它就有点类似于日本动画的风格。 他们显然不是想游戏画面看起来和显示世界一模一样的,所以利用NPR来突出自己独特的美术基调,展现不同的美术风格,从而吸引玩家。 NPR在数字人的体现 在数字人的概念在互联网中异常火热的时候,业界也出现了...
浅谈数字人仿真的渲染技术(三)
前言 这篇文章是我在OGEEK上做过的《浅谈数字人仿真的渲染技术》分享的第三部分,在这一部分我会着重介绍数字人的毛发渲染的技术。 毛发 在前面的内容,我们大致了解了一些皮肤相关的技术,接下来我们再简单了解一些毛发的渲染算法。 和皮肤一样,其实毛发的构造比我们预想的也要复杂许多,它包括表皮的角质层,角质层里面的皮质,以及发髓。 角质层有坑坑洼洼的表面,而且头发的坑坑洼洼具有较为统一的指向性,从发根指向发尾,简化后的头发模型如下图所示。 Kajiya-Kay模型 下面我们来了解一下可能是游戏中毛发渲染最常用的毛发渲染模型,Kajiya-kay模型。 简介 首先需要说明的是,Kajiya-Kay模型是一个基于经验的模型,也就是说这个模型并不是根据头发的物理结构得出的,所以会有一些并不真实的地方。 作为一个1989年的shading model,它具有算法简单,便于理解,计算量小。且头发的主高光的性价比高,效果明显。 那么kajiya-kay模型的一个核心就是各向异性高光,不知道有没有对各向异性不熟悉的朋友,这里简单说明一下,各向异性就是物体的某些特征根据方向的不同而有所变化。 如下...
浅谈数字人仿真的渲染技术(二)
前言 新年好。这是接着上次关于数字人渲染技术的第二部分,今天的这部分的分享,我会开始介绍一些关于数字人渲染的实际技术。 数字人渲染技术介绍 接下来我们来聊一下数字人渲染技术方面的课题,我本身其实在这方面也不是什么大牛,在这里只是把一些我所学到的东西分享给大家。本次也不涉及到过深的技术讨论,如果想要对某个算法的细节想做更深的探讨,我们可以做后续的讨论。 在这里我提前预告一下,接下来的分享会包括哪些方面。 首先是会介绍一些数字人常用的渲染技术,比如皮肤,头发的渲染技术。在介绍这些渲染技术的时候,我主要会解释一下这个算法的构成,他是基于哪些理论而得出的算法,他的流程大致是怎样的,以及效果的一些展示。 本次分享不会包括的方面有: 数学公式推导,当今很多渲染的算法都会遵循实际的物理意义,大多包含较为复杂的数学公式的推导,以辅助实现最后的算法。我们今天的分享是浅谈,所以不会讲的那么深,要是专注于数学公式推导的话会花上非常多的时间,门槛也会提升很多,这块并不是今天的目的。 另外一个是不会Review相关的Shader代码或者材质蓝图连线,今天主要是希望大家理解好概念就好,代码这些在理解...
浅谈数字人仿真的渲染技术(一)
前言 在2022年12月,我受邀在OGEEK上做过一次关于数字人渲染技术的分享,名为《浅谈数字人仿真的渲染技术》。为了这次分享我查阅了大量资料做了很多准备,但是很不幸的是在分享的前两天我便感染了新冠,身体开始发烧外加喉咙开始隐隐作痛。为了不影响OGEEK的流程我便在病情还未恶化的时候将分享提前录了下来,以播片的形式参加。 这段经历确实还挺难忘,近期又翻到了这篇准备的PPT,和演讲的录屏,于是想将这部分内容做个记录,整理成文章分享出来。 由于PPT内容还是比较多的,哪怕是精简后的版本也还有50多页,于是乎会准备做成一个系列,当初精简掉的部分可能也会想办法补充回来,让内容尽量的充分。 数字人简介 数字人的定义 目前数字人缺乏一个统一的标准定义,我们从它的发展起源,从技术角度上选择一个最宽泛最简洁的标准:由计算机生成的人类。 中国人工智能产业发展联盟发布的《2020年虚拟数字人发展白皮书》中给了一个更加详细的定义:虚拟数字人意指具有数字化外形的虚拟人物,除了拥有人的外观、人的行为之外、还有拥有人的思想,具有识别外界环境、并能与人交流互动的能力。 那其实这个定义里面,也描述了数字人相关的...
虚幻引擎之基于AI的贴图生成方法
前言 今年年初,由于公司部门的变动,我从原来的云服务部门调到了新成立的AI部门。 AI是最近最火热的东西,我虽然肯定算不上专业,但是也稍微有粗略的接触过一点点。再加上部门新成立没有什么业务上的压力,我便花了点时间去做了些预言,这个工具便是其中之一。 这个工具是为了研究如何将AIGC和3D工作流结合起来的成果。当时选了几个方向,包括AIGC贴图、AIGC模型和3D结合controlnet来辅助AIGC文生图等等。研究的过程中用Unreal Engine搭了些简单的demo,很可惜后续有真正的项目推进后,这些预研的内容也并未有进一步的推进了,觉得有些许可惜,于是便打算在这里记录一下。 同时这个项目也上传到了Git,有兴趣的欢迎查看:UETextureGeneration。 介绍 大体流程 这个demo的流程非常简单,参照一般文生图的流程,填写提示词、负提示词、生成步数和种子等信息。这些参数将传入给到文生图的Python脚本,脚本会运行一个大模型来创建对应的结果。 安装步骤 下面介绍一下这个工具所需要的准备工作。 首先我们需要找到引擎的python地址,如C:\UnrealEng...
屏幕空间反射
什么是屏幕空间反射 在前面的文章的一些配图中,其实已经揭露了之前在KongEngine中实现的一个不小的功能点,就是屏幕空间反射(screen space reflection)。加入了屏幕空间反射能力之后,在一些光滑和带有反射材质的表面上,能够实现不错的反射效果。 屏幕空间反射(后简称SSR)是一种在实时渲染中用于模拟物体表面反射的成熟技术。SSR 的核心原理是在屏幕空间中进行光线追踪,以此计算反射效果,而无需像传统方法那样在世界空间或物体空间中进行复杂的光线与场景求交计算。它主要利用屏幕上已有的深度图和法线图等信息,通过对这些信息的分析和处理,确定反射光线的方向和位置,进而得到反射颜色。 因为SSR不错的效果表现和相对来说比较低的性能开销,使其被广泛的应用在各个实时渲染领域,包括游戏、虚拟现实、建筑可视化等等。当然SSR的效果其实还不够完美,有很多无法解决的问题,这个在后面也会提到。但是在大多数情况下它的效果都是足够的,属于一个很高性价比的方法。 如何实现屏幕空间反射 屏幕空间反射的实现方法 简单概括一下SSR的实现方法: 对于屏幕上的每个像素,先获取其深度值和法线向量。...
软阴影的实现(PCF和PCSS)
什么是软阴影 在3D中实现阴影最基础的方法是使用阴影贴图shadowmap,根据shadowmap中存储的信息来判定当前渲染的像素是否在阴影当中。 阴影贴图的方法很好理解,但是仅仅基于阴影贴图的阴影效果,在阴影的边缘会有锯齿的情况出现。这往往是由于阴影贴图的分辨率不够导致的,然而一味的提升阴影贴图的分辨率也不是方法,毕竟实时渲染的性能也是需要考虑的一个方面。 那么该如何在可接受的性能表现下实现软阴影的效果呢,下面详细介绍两种方法:Percentage Closer Filtering(PCF)以及Percentage Closer Soft Shadows(PCSS)。 柔和阴影边缘-PCF 下面是一个普通的阴影效果: 这个阴影贴图的分辨率是2048,这是在CSM的最低一级的阴影效果。可以看到阴影边缘的锯齿感非常的强烈,同时由于采样精度的问题,模型的腿上也出现了不正确的阴影区域。最简单的方法就是通过提高阴影贴图的分辨率来缓解这个问题,但是显而易见这不是最好的解决方案,而Percentage Closer Filtering(后简称PCF)可以帮助我们解决这个问题。 什么是PCF...
反射阴影贴图
反射阴影贴图简介 反射阴影贴图(Reflective Shadow Map)是实现全局光照效果的一个非常经典的方法,它是在这篇论文中被提出。 直接光照和间接光照 它的名字中带有“阴影贴图(Shadow Map)”几个字,所以乍看之下这个方法似乎是用来解决阴影问题,或者是提升阴影效果的。其实不然,它是用来解决间接光照的问题的方法。 在一般的场景中,光照可以大致分为两类: 一类是直接光照,也就是物体被光源直接照亮的部分。这个类型的光照是比较好计算的,通过光源的入射角,物体表面的法线和材质,以及观察的方向等等,利用PBR的方法能够得到非常不错的效果,这个流程在KongEngine中已经基本实现了。 另外一个类型是间接光照,它代表的是光线经过一次甚至多次反射后照亮物体的部分。相对于直接光照,间接光照十分复杂,因为光线可能经过多次反射,想要实时的计算光的多次反射的完整路径是很难实现的。但是如果不包含间接光照的话,场景的真实度会大打折扣。在最基础的PBR渲染框架中,我们可以选择手动输入一个环境光照(Ambient Light)的颜色,可以简单的表现全局光照,但是真实性还是不够。 反射阴影...










