目录 思路 基础的RayMarching 获取深度图 重建世界空间 采样阴影图 RayMarching 当前效果 DualBlur优化块状感 DualBlur 叠加模糊后的体积光和原图 进化叭!RayMarching! 性能优化 最终效果 Reference 思路 观察下面这副图可以发现,在明亮处光很明显,暗处(阴影中)没有明显的光,且越暗光越不明显 为了还原这一现象,可以想到的是根据目标pixel的阴影值来计算亮度。但如何营造光的体积感呢?这就需要用到光线追踪!的思想rayMarching(光线步进)与光追不同的是,光追是每个pixel,在场景中发射一根射线并不断弹...

  398vzLiyyaJn   2024年03月13日   47   0   0 游戏开发

前言 云的实现一般有三种思路:Volume体积云、billboard公告牌、Particle粒子,对于风格化来说体渲染的实现过于真实(但光遇的风格化云貌似是使用体渲染实现的,后面有空会考虑尝试还原还原),而Particle消耗太大了!因此本文将着重展现如何使用公告牌技术实现一个不错的风格化云效果 Youtube上有位大佬讲解了如何使用houdini和ue快速实现一个吉卜力风的卡通云,虽然效果还是ok,但个人认为,这种方法容易露馅。不过,这其中的制作云的思路可以参考,无需再用PS来频繁上色。本篇将在此基础上,添加实现其他的功能(主要思路来自TylerSmith) 光照计算 为了方便,这里使用B...

  398vzLiyyaJn   2024年01月02日   15   0   0 游戏开发

前言 笔者曾使用UE实现过一个较为完整的写实水材质系统,但是因为UE的管线是定死的,导致高光无法实现,且后来做笔试题发现关于水的交互还未实现,因此本文将实现一个完整的风格化水,考虑到水的实现部分过多,这里不再使用代码展示,而是使用ASE,原理都差不多 管线设置 “ShaderType”为“Universal/Unlit” “Surface”为“Transparent” “VertexPosition”为“Relative” 深度 水深不必多讲,在UE的watershader中曾实现过,就是用scenedepthpixeldepth 实现如下这里需要根据相机的深度图重建世界坐标,请注意该方...

  398vzLiyyaJn   2023年12月30日   25   0   0 游戏开发

前言 作为新博客的第一篇,就用卡渲作为开篇叭!毕竟是个二次元乐。本篇同步发表于http://chenglixue.top/index.php/unity/73/ 之前使用UE的后处理做过简单的卡渲,但因其灵活性很差,很多操作都需涉及到更改管线,且奈何本人在校用的笔记本,一次build就得好久,因此放弃对卡渲的深入。如今对URP基本的使用掌握的差不多,是时候深入研究卡渲了 本篇是卡渲篇的首篇,介绍角色的渲染方式,主要参考原神的方式。 开发环境 Unity2021.3.32f1下的URP Win10 JetBrainsRider2023.2 材料准备 虽然模之屋提供了一些角色的模型和纹理,但很...

  398vzLiyyaJn   2023年11月22日   23   0   0 游戏开发

前言 虽然Untiy提供了不少postprocess功能,但这些功能是固定的,没法修改,这让我很不舒服。本文将介绍如果通过RenderFeature来实现自定义PostProcess——BoxBlur 测试环境 Unity2021.3.32 Win10 JetBrainsRider2023.2 RenderFeature 什么是RenderFeature RenderFeature类似于Pass,可以自定义渲染顺序、渲染对象、材质等 说白了就是对于unity既定的渲染流程,可以在任意位置添加某个额外的功能(如描边),也可以自定义数据 添加RenderFeature先创建"Univer...

  398vzLiyyaJn   2023年11月12日   24   0   0 游戏开发

C语言中,数据与处理数据的操作(函数)是分开声明的,这种程序方法被称为程序性的;而在c中,则是使用abstractdatatype(ADT)或classhierarchy的数据封装 c对于结构体和函数(不包含virtual和non-inline)的封装并没有增加布局成本,对于C而言,在布局以及存取时间上主要的额外负担是由virtual引起 virtualfunction virtualbaseclass ThecObjectModel c中,有两种classdatamembers:staticandnonstatic,和三种classmemberfunctions:static、no...

  398vzLiyyaJn   2023年11月02日   37   0   0 C++

defaultconstructor defaultconstructor只有在被编译器需要时,才会被合成出来,且合成出的constructor只执行编译器所需要的行动(并不对成员初始化) 含有defaultconstructor的memberclassobject 在c各个不同的编译模块(文件)中,编译器将合成的defaultconstructor、copyconstructor、destructor、assignmentcopyoperator都用inline方式完成来避免合成多个defaultconstructor 若一个class没有任何constructor,而其内含的memb...

  398vzLiyyaJn   2023年11月02日   25   0   0 C++

classobjectlayout //64位系统 classA{}; //sizeof(A)为1 classB:virtualpublicA{}; //sizeof(B)为8 classC:virtualpublicA{}; //sizeof(C)为8 classD:publicB,publicC{}; //sizeof(D)为16 //sizeof(A)为1是因为编译器会安插一个char,使得多个object会有不同的地址 内存布局: 造成B和C大小为8的原因如下: 语言本身造成的额外负担。若derivedclass派生自virtualbaseclass,则derivedcla...

  398vzLiyyaJn   2023年11月02日   54   0   0 C++

memberfunctions的调用方式 c支持三种类型的memberfunctions:static、nonstatic、virtual,且每一种调用方式不尽相同 nonstaticmemberfunctions nonstaticmemberfunction至少和nonmemberfunction有着相同的效率 ​现有如下函数调用: floatdo(constA_this){...} floatA::do()const{...} //第一个函数转换 floatdo(constA_this) { returnsqrt( _this->x_this->x+_this-...

  398vzLiyyaJn   2023年11月02日   28   0   0 C++

抽象基类 ​现有如下代码: classAbstract_base { public: virtualAbstract_base()=0; virtualvoidinterface()const=0; virtualconstcharmumble()const{return_mumble;} protected: char_mumble; } ​以上抽象基类声明有几个问题: 即使class被声明为抽象基类,其依然需要explicitconstructor来初始化protecteddatamember_mumble,否则derivedclass无法决定_mumble初值 抽象基类的virtu...

  398vzLiyyaJn   2023年11月02日   38   0   0 C++

obejctconstructionanddestruction ​一般而言,constructor和destructor的安插都如预期那样: { Pointpoint; //point.Point::Point()安插于此 ... //point.Point::Point()安插于此 } ​但有些情况desctructor需要放在每一个离开点(此时object还存活)前,例如swith,goto: { Pointpoint; //point.Point::Point()安插于此 swith(int(point.x())) { case-1: ... //point.Point::Poin...

  398vzLiyyaJn   2023年11月02日   47   0   0 C++

template 声明 ​当我们声明一个templateclass、templateclassmemberfunction等,会发生何事? ​现有如下片段: template<classType> classPoint { public: enumStatus{unallocated,normalized}; Point(Typex=0.0,Typey=0.0,Typez=0.0); Point(); voidoperatornew(size_t); voidoperatordelete(void,size_t); //... private: staticPoint&lt...

  398vzLiyyaJn   2023年11月02日   31   0   0 C++

前言 ​本篇将介绍图形调试工具pix,使用该工具可以对图形管线进行debug。貌似VS不再支持D3D12的图形调试,笔者的VS无法捕获帧 环境搭建 配置用于CPU捕获的PDB 生成完整的PDB 设置符号路径srvc:\symcachehttps://msdl.microsoft.com/download/symbols usingpix3.h pix3.h包含在WinPixEventRuntime,在这里我们使用VS加载WinPixEventRuntime。步骤如下 右击解决方案,再点击"ManageNuGetPackages" 点击"Browse",搜索"WinPixEventRunt...

  398vzLiyyaJn   2023年11月01日   58   0   0 游戏开发

前言 本篇使用UE5的材质系统实现运动的扭曲效果,并解决他的重复性 纹理变换 总结思路为uv坐标添加time节点 实现如下图所示,Texcoord指定uv起始坐标,提供一个float2变量和Time节点相乘(这样对Time有控制权),将相乘结果与uv坐标相加,最后传给采样器 扭曲效果 原理由于噪声的值是固定随机的,将噪声函数应用到纹理中使得纹理的各通道呈现随机性,使用噪声纹理可以做到偏移uv坐标,这样即可实现扭曲效果 思路噪声纹理提供uv坐标,将该uv坐标用于纹理的采样 实现 控制扰动强度 解决:可以看到采样生成的纹理过于扭曲,这是因为纹理贴图中提供的噪声值过大,此时乘以一个val...

  398vzLiyyaJn   2023年11月01日   19   0   0 游戏开发

潮湿效果 物体表面是如何变湿的? 物体表面吸水使颜色变深 潮湿的颜色会变得暗淡且饱和 实现 增加饱和度且变暗 潮湿的物体表面的特点 当水作用在材质表面,材质表面的specualr会略微变弱且粗糙度会大幅降低 对于积水的表面,我们设置它的roughness=0.07,specualr=0.3,一个value=1用于控制潮湿程度,最后进行lerp即可 实现 潮湿程度为1的效果 潮湿程度为0的效果 加入多孔性多孔性也就是吸水性,多孔性越高,颜色越暗 表面水珠(RainDrop)效果 本节展示如何实现雨滴效果 雨滴纹理 为了实现表面水珠,我们需要一个雨滴纹理,它的RG通道表示雨滴法线;...

  398vzLiyyaJn   2023年11月01日   39   0   0 游戏开发

前言 非真实感渲染的风格不经相同,其中一种便是油画风格,本文总结了如何实现油画滤镜的方法 KuwaharaFilter 为什么使用KuwaharaFilter?一般对图像进行模糊处理,会使用低通滤波器,但往往模糊后图像会失去它们的硬边,但KuwaharaFilter可以在平滑图像的同时也能保留其硬边 如何实现KuwaharaFilter? KuwaharaFilter也是使用卷积,但不同之处是KuwaharaFilter需要四个卷积核 过程:计算每个卷积核的平均值(平滑噪点)和方差(衡量一个内核的颜色变化率),一共四个。找出方差最小的卷积核并输出其平均值 例子对于上图的计算动图如下右边...

  398vzLiyyaJn   2023年11月01日   66   0   0 游戏开发

Bresenham算法介绍 ​画线算法有三种,分别是DDA算法、中点算法、Bresenham算法,但为什么我们选择Bresenham算法呢?因为Bresenham算法仅仅使用整数加法、减法和位移,是一种增量误差算法,这些操作省时高效精确,是当前最有效的画线算法。并且,此算法并不局限于直线,圆等其他曲线同样可以画。更重要的是,该算法用于绘图仪等硬件和现代显卡的图形芯片中,以及非常多的软件图形库中都可以看到他的身影。鉴于Bresenham算法的简单高效,因此我们选用他作为实现渲染器的一部分 Bresenham算法思想 ​在图形学中,屏幕是一个二维数组,数组里的每一个元素都为一个像素,其中每个像素...

  398vzLiyyaJn   2023年11月01日   76   0   0 计算机图形学

在此篇中,我们将学习如何绘制一个三角形并对其进行着色,如何判断屏幕中同一个像素位置顶点的前后顺序 绘制三角形和平面着色 ​绘制图形,我们需要画线也就需要学习画线算法,但图形种类多种多样,为什么我们选择学习三角形呢? ​因为三角形是最基本的多边形,其拥有许多特性: 三角形可以分解其他多边形,也就是我们可以不断分解其他多边形,最终形成有多个三角形组成的多边形 三角形保证是平面的 三角形可以用叉乘判断内外 三角形内部可以定义插值 ​在讲明为什么我们选择三角形作为最基本的图形后,我们现在来学习如何绘制一个三角形 ​按照之前的画线算法,我们可以很轻松的画出三角形来,如下图。但问题是我们平时在游戏中...

  398vzLiyyaJn   2023年11月01日   72   0   0 计算机图形学

前言 在上一篇中,我们以正交投影的方式学习了如何绘制三角形,但在生活中我们眼睛看到的现象用正交投影无法解释。比如如果是正交投影,我们看到的铁道两个铁轨在视角上并不会交于一点,也就是两个铁轨的间距并不会随着离我们的位置越远,而变小,实际上这正是透视投影。因此,对于渲染摄像机理解为我们的眼睛,用透视投影来表示;而正交投影则主要用于主要用于二维渲染以及建筑工程软件 如下右边是正交投影,左边是透视投影 2d变换 ​开始之前,需要提醒一下,以下向量表示都是列向量 缩放沿主轴缩放 反射2维中围绕直线翻转对象 错切(剪切)不均匀地拉伸坐标空间。思路是将一个坐标的倍数添加到另一个坐标上 旋转二维中围...

  398vzLiyyaJn   2023年11月01日   169   0   0 计算机图形学
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~