自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

(ง •̀_•́)ง

不要觉得自己很菜,也不要觉得自己很强

  • 博客(222)
  • 收藏
  • 关注

原创 [引擎开发] 深入C++模板编程

本文大纲]引言模板实例化隐式实例化显式实例化模板具体化显式具体化部分具体化函数重载和具体化类型推断隐式类型转换支持的类型转换引用和const通用引用、引用折叠和完美转发通用引用和右值引用类型萃取typename关联类型类型萃取迭代器萃取特性萃取 - SFINAE特性auto和decltypeautodecltype后置返回值类型逗号运算符与类型限制lambda函数可变参数模板参数包展开函数模板:使用函数展开函数模板:使用初始化表展开。

2024-02-25 21:38:07 882 1

原创 [引擎开发] 深入GPU和渲染优化(进阶篇)

在上述的基础篇中,我们对各种概念做了一个简单的介绍,在此篇文章中,我们将做更进一步的讲解。

2023-12-17 16:01:14 1089

原创 [引擎开发] 杂谈ue4中的Vulkan

接触Vulkan大概也有大半年,概述一下自己这段时间了解到的东西。本文实际上是杂谈性质而非综述性质,带有严重的主观认知,因此并没有那么严谨。使用Vulkan会带来什么呢?简单来说就是对底层更好的控制。这意味着我们能够有更多的手段去提升绘制的效率。这里Vulkan主要能够提升的是CPU端的效率,GPU端的效率是无法直接提升的。这里所说的提升CPU的效率,实际上描述的是Vulkan能够更好地控制渲染数据的准备,那么这个渲染数据的准备具体来说就是完成渲染指令的编码。

2023-10-05 20:27:20 1249

翻译 Arm Mali GPU最佳实践(Arm Mali GPU Best Practices)

本文设计为快速查询指南,所以假设读者熟悉了底层API的使用;我们将在其它文章中更详细地去讨论特定的主题,并花更多时间向仍在学习API的开发人员解释相关的概念。注意:这些建议是为Mali GPU提供最佳实践,但实际中应用非常复杂,这些一般性的建议总会有例外。我们强烈建议对优化进行实测,来验证它们是否在目标设备上按预期执行。

2023-02-26 14:59:21 2567 1

原创 [ue4] 着色器绑定(Shader Binding)

当我们在ue4中制作了一个美术材质之后,引擎本身会为我们做很多事情,它会把结点翻译为hlsl,生成多个shader变体,并在多个mesh pass中去选择性的调用所需的shader,其中一个重要的过程就是获取shader绑定的数据。本文将主要讨论ue4是如何处理来自材质的不同的输入,它们将以怎样的形式传递给shader,以怎样的频率更新,并在调用层做了怎样的优化处理。

2023-02-12 19:39:29 1489

原创 [引擎开发] 现代图形API - metal篇

在我们对Metal进行介绍前,先来了解一下Apple GPU。metal在工作提交、显存管理上和dx12,vulkan这样的API设计比较接近,而在资源管理和绑定上的设计差异较大,这使得我们在考虑跨平台的应用时,需要充分理解API层面的设计。此外,Apple的开发者文档较为详细且完善,并且每年也有开发者大会对整个API的设计,以及一些新推出的特性进行介绍,这也是值得我们持续关注和学习的。t=MBR7。

2023-02-02 23:50:18 1758 1

原创 [引擎开发] 现代图形API - dx12篇

dx12引入了非常多全新的概念,在了解了这些概念的含义后,我们还应该认识到,所有的设计都基本是为了性能来考量的。之所以将渲染提交设计成可录制的指令,是为了方便多线程的录制;之所以独立出了管道状态对象,是为了避免维护状态上下文带来的消耗;之所以将资源绑定设计为像指针一样的描述符或描述符表,一是为了让绑定变得更加轻量(更少的绑定数量),二是可以支持动态的资源访问(bindless);

2023-01-26 20:34:04 1987

原创 [引擎开发] PBR材质的原理

[本文大纲] 基础概念篇 引入 光线与介质的作用 微平面理论 中间向量 能量守恒定律 光照计算 半球积分 反射率方程 BxDF 各向同性和各向异性 Disney BRDF Diffuse BRDF Specular BRDF ...

2022-05-03 00:22:34 4413 2

原创 [引擎开发] 深入C++拷贝控制

C++作为引擎开发的常用语言,是因为它的设计更加面向底层,我们有更多的控制内存的手段,以获得高性能的程序。这种控制内存的手段不仅体现在对内存分配管理上,也体现在内存的拷贝控制上。这意味着,为了编写高性能的代码,我们不仅需要关注逻辑的正确性,还需要对每条逻辑下发生了哪种情况的拷贝有着比较明确的认知。变量的初始化什么是变量的初始化?它是指对象在创建时,被赋予了一个特定的值。 C++中有两组不应混淆的概念,一组是声明和定义,另一组就...

2022-02-13 22:42:16 5662 1

原创 [ue4] Niagara的Indirect Draw

Indirect Draw Buffer 调用Indirect draw接口时,需要构造一个固定的InDirectArg缓冲区。这个缓冲区有五位数据,是由图形API定义的必须填充的结构。 可以参考DirectX中间接参数缓冲结构的定义: Indirect Draw Arg的填充通过计算着色器完成,相关的逻辑位于NiagaraDrawIndirectArgsGen.usf。RWDrawIndirectArgs[ArgOffset + 0] ...

2021-12-27 19:40:00 9025 1

原创 [引擎开发] 渲染架构与高级图形编程

[本文大纲] Shader编译 通用图形接口 绘制 多线程架构 独立渲染线程 独立图形API线程 多线程渲染提交 多核架构 后处理 1

2021-07-04 17:17:59 8612 6

翻译 [图形学] Real Shading in Unreal Engine 4

图1 UE4 Infiltrator demo简介 大约一年前,我们决定投入一些时间来改进我们的着色模型,并采样更加基于物理的材质工作流程。这是由于我们想要渲染更加真实的图像,但同时我们也对更加物理化的材质创建方法和材质分层的使用可实现的目标感兴趣。美术认为这将是对工作流程和质量的巨大改进,Epic的一位技术美术尝试在着色器中使用分层,结果是很有希望,这成...

2021-05-30 11:51:29 587

翻译 [图形学] Adaptive Shadow Map

reference:https://www.cs.cornell.edu/~kb/publications/ASM.pdf概述 阴影贴图提供了一种快速方便的方法来识别场景中的阴影,但是会引入锯齿。本文介绍了自适应阴影贴图(ASM)作为此问题的解决方案。ASM通过解决眼睛视图和光源视图之间的像素大小不匹配来消除锯齿。通过将光源贴图(即光源的阴影图)存储与常规平面结构相反的分层网格结构,可以实现这一目标。在像素从相机视图转换为灯光视图时,可以改进ASM以在需要时创建更高分辨率的阴影图。这...

2021-05-15 16:54:08 7141

原创 [ue4] 级联阴影CSM

本文主要讨论ue4中,CSM阴影深度图渲染流程以及一些细节实现,不包括阴影绘制的流程。 灯光初始化数据 计算Cascade外接包围球 计算精确阴影凸包 计算阴影灯光视图空间矩阵 计算阴影灯光裁剪空间矩阵 计算接收和投影阴影的视锥体 降采样相机平滑处理 阴影图元的收集 阴影深度的绘制 阴影数据初始化的整体入口为:InitDynamicShadows,包含了所有类型阴影的数据准备和初始化,在In...

2021-05-05 00:44:33 9520 2

原创 [OpenGL] 纹理高级篇 - flowmap的原理

flowmap简单来说就是一种特殊的uv纹理动画,我们把运动向量记录在纹理中,并让纹理uv向特定方向运动。 它的原理非常简单,但如果你直接将运动向量乘以时间,叠加到原始纹理坐标上,那么你不会得到正确的结果:vec2 motionvector = texture(flowmap, uv).xy * 2 - 1; // decode motion vectoruv = uv + time * motionvector;vec3 color = textu...

2021-03-20 17:47:08 6401

翻译 [图形学] Hair Simulation in TressFX(头发模拟)

reference:《GPU Pro5》Hair Simulation in TressFX 人类的头发大约有120000根,由于渲染成本高和缺乏实时仿真技术,在实时视频游戏中呈现人类的头发一直是一个挑战。因此,许多艺术家和游戏开发人员必须选择其它方法,例如使用简单的多边形和纹理。 在本章中,我将解释TressFX中的头发模拟方法,该方法已在最近的Tomb Raider和AMD Rudy演示中使用。 在高端GPU中,它可以在不到一毫秒的时间内模拟大约19...

2021-02-06 16:23:57 6741

原创 [引擎开发] 深入GPU和渲染优化(基础篇)

GPU/渲染优化是引擎开发中非常重要的一个环节,实际上在工程中做任何渲染相关的内容,都需要考虑到背后的原理和性能。另一方面,GPU/渲染优化是一个非常宽泛的课题,它不仅涉及到针对底层GPU的架构做出的相关优化,图形API的设计和使用的优化,也会涉及到CPU中渲染数据准备的优化,或者shader编写的优化等多方面的内容。 GPU PC GPU架构 移动端GPU架构 GPU瓶颈 带宽 ALU ...

2021-01-15 00:12:28 12073 5

原创 [ue4] 材质和Shader变体(Shader Permutation)

材质种类 ue4中的材质主要有两个类型,一种是与mesh相关的,比如物体的表面材质;另一种是mesh无关的,比如后处理材质。材质与Shader的关系 材质属于美术资产,ue4底层会将材质节点翻译成HLSL代码,并根据模板HLSL代码和相关宏编译成最终的Shader Code。 对于mesh无关的材质而言,通常只对应着一个Shader。 对于mesh相关的材质而言,则可能会生成非常多的Shader Code,我们称之为Shader变体...

2021-01-08 20:36:20 8949 1

翻译 ASTC纹理压缩格式(Adaptive Scalable Texture Compression)

ASTC(Adaptive Scalable Texture Compression)介绍Adaptive Scalable Texture Compression(ASTC)是一种世界领先的新型纹理压缩格式。这种压缩格式已经加入Khronos标准,并已在某些硬件平台中提供。本文介绍了它的工作原理、使用方法和如何最大程度地使用它。更深入的信息可以参考编码器提供的规范[Eva]。背景ASTC由ARM Limited针对目前已有的填充率较低的纹理压缩开发的一种灵活解决方案。在过...

2020-12-03 14:35:44 12791

原创 [引擎开发] 深入C++内存管理

引入 说到C++的内存管理,我们可能会想到栈空间的本地变量、堆上通过new动态分配的变量以及全局命名空间的变量等,这些变量的分配位置都是由系统来控制管理的,而调用者只需要考虑变量的生命周期相关的内容即可,而无需关心变量的具体布局。这对于普通软件的开发已经足够,但对于引擎开发而言,我们必须对内存有着更为精细的管理。程序的内存布局内存碎片内存对齐缓存机制SIMDCachestl的内存控制allocator堆栈分配器模型池分配器模型碎片整理tcmal...

2020-10-25 15:10:03 13083 12

原创 [ue4] 几何体绘制管线

几何体绘制管线,通俗来说,就是通知GPU绘制物体信息的一套完整流程;ue4封装了一套较为复杂的框架来维护整个流程,本文将对整个流程做一些简单的介绍。引入 ue4的大部分核心渲染代码入口都在FDeferredShadingSceneRenderer::Render(FRHICommandListImmediate& RHICmdList)这一函数中(以及对应的Mobile版本),在这里可以比较详细地看到整个渲染流程中先后做了哪些事情。其中,在渲染前期的时候,一个比...

2020-10-14 20:19:49 5021

原创 [ue4] HISM 大规模植被渲染解决方案

HISM,即HierarchicalInstancedStaticMesh,是ue4中针对类似植被这样大规模重复物件渲染提供的一种解决方案。本文仅作为HISM设计的导读,具体细节需参照源码的实现。daISM 在讨论HISM之前,我们先来看一下ISM,即InstancedStaticMesh。简单来说它就是ue4提供的实例化渲染,通过Instance,绘制n个相同的物体,原来需要n次drawcall,现在只需要一次就可以了(更多的细节可以猛戳这里)。 想...

2020-09-26 02:10:30 13174

翻译 [OpenGL] 几何着色器

几何着色器 几何着色器(GS)是一个使用GLSL编写的处理图元生成的shader程序,它位于顶点着色器(或者可选的细分阶段)和固定的顶点后处理阶段之间。 几何着色器是可选的,并非必须的。 几何着色器调用将单个图元作为输入,可能会输出零个或多个图元。可以通过代码实现来限制单个GS调用生成的图元数量。我们编写GS以接受特定的图元输入和特定的图元输出。 尽管GS可以用于放大几何形状,从而实现粗略的曲面细分,但这通常不是GS的一个好用法。使用GS...

2020-07-05 22:45:35 4339

翻译 OpenGL4.0教程 计算着色器简介

reference:https://antongerdelan.net/opengl/compute.html 本篇文章给出了OpenGL计算着色器的实用介绍,并且我们将要开始制作一个玩具光线追踪渲染器。在阅读本教程前,你需要具备一定的OpenGL基础,并且知道如何将纹理渲染到全屏四边形上。 我之所以推迟编写OpenGL计算着色器的教程,是因为我希望先总结足够多的坑,以便可以帮助人们避免常见错误,并有足够多的经验来给出一些有用的建议。我想到我之前从未写过关于光线追踪或路径追踪...

2020-06-16 01:55:09 5385

翻译 [图形学] 基于OpenGL ES 3.0的高效目标变形动画

reference: Efficient Morph Target Animation Using OpenGL ES 3.0 James L. Jones介绍 移动平台上对高质量图形渲染的需求推进了GPU和图形API的发展,例如OpenGL ES 3.0;这些硬件/API上的进步使得程序员能够编写更加简洁、高效的图形学算法实现。其中的一个受益领域就是手机游戏中角色的面部动画,该技术通常通过目标变形(morph target)来实现。目标变形动画通常要求美术离线制作模型的多个姿态,然后...

2020-06-14 16:48:08 4056 1

原创 [OpenGL] 使用计算着色器进行预烘焙

https://www.khronos.org/opengl/wiki/Compute_Shader 首先对官网内容的不完全翻译: 计算着色器不属于渲染管线的一部分,而是一个较为独立的过程。不同于顶点着色器对每顶点执行一次,片段着色器对光栅化的每片元执行一次,计算着色器的空间是抽象的,由用户自己定义的。 工作组 工作组是用户可...

2020-05-25 00:10:53 4221

原创 [OpenGL] 捏脸系统

本文的主要内容是介绍了一下自己验证捏脸系统一个方案的小实验。 很早之前便有捏脸系统的一个设想,但由于demo中没有引入动画系统所以一直没有来得及验证。捏脸系统一个美术工作量比较小的方案是基于骨骼动画的,我一开始的想法是,对于骨骼动画而言,既然绑定姿态(bindPose)能够反映不同的体型,那么它同样也能够反映不同的脸型。也就是说,我们需要实现一套运行时修改角色绑定姿态(脸部骨骼平移、旋转等)并能实时反馈修改,支持记录并读入修改数据,支持场景中同一体型中不同角色加载各自的捏脸

2020-05-17 17:03:34 6551 1

原创 [OpenGL] 骨骼动画混合效果

本文主要讨论两个骨骼动画过渡时的混合效果。切换动作效果演示 在游戏中,动画往往被切分成多个片段(clip),通过组合拼接来构建最终的表现效果。为了确保切换动作时的平滑过渡,使得整体动作更加流畅,需要对前后动作通过插值进行混合。 概念引入 在讨论具体的混合计算之前,我想依然有必要明确一下整个动画系统体系的一些细节。 ...

2020-04-26 00:55:59 4260

原创 [OpenGL] 骨骼动画原理和实现(Qt)

本篇文章主要讨论骨骼动画的基本原理,以及动画的导入和绘制。概念引入 对于网格体而言有不少实现动画的方式。直接对顶点进行操作也就是顶点动画,适用于一些比较简单的植物摆动、水面波动效果。此外,还有在两个网格之间进行插值的morphing动画;但它们本质上都是对顶点进行操作。 而在某些情况下,我们认为某些区域的顶点具有关联性,并且希望能够对其整体进行...

2020-04-10 23:36:27 8212 3

原创 [OpenGL] SSAO效果

SSAO也就是屏幕空间的环境光遮蔽,是实时渲染中为了模拟环境光遮蔽效果采取的一种近似算法。它主要表现的是物体自遮挡部分产生的阴影,可以增加场景的明暗层次感。 这个效果我在一年前已经看过了相关资料,不过一直没有尝试实现。最近花了点时间模拟了一下,不过效果不算太好。此处只是分享一下我的实现。基本原理 上图来自real-time render...

2020-01-18 23:38:52 2347

原创 [OpenGL] 植被的动画和笔刷效果

资源来自Unreal商店植被的渲染 植被的模型是通过建模导入得到的,本身是由多个面片组成的。 整个植被包含了albedo贴图+法线贴图+mask贴图。 我们使用一张mask贴图来完成透明测试,丢弃额外的像素。同时,需要关闭背面剔除,避免移动视角后植被消失。默认渲染 透明测试渲染植被的动画 接下...

2020-01-04 00:25:43 1125

原创 [OpenGL] Cascade Shadowmap(层级阴影)

这几天花了点时间优化了一下阴影。 原本的阴影实现有一些比较严重的问题: 第一个是我使用了透视投影,再加上角度问题,导致阴影看起来存在近大远小的变形,不符合太阳光产生的阴影; 第二个是我的阴影贴图是在世界空间的固定位置生成的,且阴影贴图的大小是有限的,导致整个画面中,只有落在阴影贴图中的非常小的一部分物体能够产生阴影;如果扩大阴影...

2019-12-24 23:02:03 1099

原创 [OpenGL] 刷地形初版实现

最近做了刷地形的初版效果,由于近期较忙,所以就简单地说一下大致的方案。 本身刷地形的原理并不难,即在鼠标选择位置的一个范围内,通过指定的高度模板,以叠加的方式改变地形高度。画刷模板 在画刷模板这一块没有过多讲究,直接使用了高斯算子。 根据画刷大小生成不同大小的画刷算子。为了保证不同大小的画刷算子形状一致,此处限制了高斯函...

2019-11-11 22:50:36 736

原创 [C++] 对象属性的自动序列化与反序列化

对于一个有着多个属性的类对象而言,我们通常希望能够对其进行序列化与反序列化,以保存和导入我们记录下来的物体数据。编写这样的代码通常是繁琐的,并且会带来大量冗余。 目标 我们期望能够达到这样的效果,在类中声明变量的时候,能够自动注册相关的信息。在序列化和反序列化的过程中,该变量的值就会自动被解析,而无需额外的编码。 这意味着,我们的代码...

2019-10-20 17:29:00 1052 2

原创 [OpenGL] 延迟渲染下的简单透明渲染机制

reference:http://www.klayge.org/wiki/index.php/%E5%BB%B6%E8%BF%9F%E6%B8%B2%E6%9F%93 本文主要描述了自己实现延迟渲染下的透明物体渲染机制的过程。方案探索 前提是已经实现了基本的延迟渲染框架,但还没有支持透明物体的渲染。最近打算开始进行这一项工作。 目前接触到的一个比...

2019-10-10 20:32:07 2264 1

原创 [OpenGL] 屏幕后处理:景深效果

开发环境:Qt, OpenGL立方体纹理是Qt官方教程Cube里自带的纹理。概念引入 景深是摄像中的术语。相机聚焦后,镜头前远近平面之间的物体能够清晰成像,这一段清晰成像的距离也就是景深,我们可以从下图更直观地理解景深。 为了在绘制中模拟景深这一效果,一个直观的想法是,获取物体和相机的距离,根据这一距离和远近平面的关系,来决定物体...

2019-10-09 10:17:17 5810

原创 [OpenGL] 曲面细分特性实践

参考资料:https://www.nvidia.cn/object/tessellation_cn.htmlhttps://www.opengl.org/wiki/Tessellation背景 首先曲面细分顾名思义是将一个面片划分为更多面片,使得模型更加精细。此处我们讨论的曲面细分更偏向于运行时的细分生成,而不是在建模软件中的离线细分。 这一过程是可...

2019-08-24 21:25:52 1439 3

原创 [OpenGL] 使用Assimp导入模型(Qt)

最近终于决定要在自己的demo中加入模型了!本次选择的是开源库Assimp,之前一直嫌麻烦没有去落实这件事,但实际上,assimp的配置意外的没有我想象中的那么麻烦。 参考这篇文章基本上可以配置成功https://learnopengl.com/Model-Loading/Assimp,它所提到的坑我都遇到了。 这里是Assimp下载地址:http:/...

2019-05-12 19:48:22 4508 10

原创 [OpenGL] Bloom自发光效果

之前在看Unreal的材质时,发现里面有一个自发光效果(unreal自发光),就暂且猜测它使用bloom后期处理做的吧。不过它这个自发光还能照亮周围场景,估计这套照亮的系统和自发光的泛光效果是独立的,只是将其作为了一个物体光源。基本思路 首先,本处要做的是对单个物体控制自发光效果,而不是一个全屏泛光效果,所以我们需要做一些特...

2019-05-02 23:24:21 3101

原创 [OpenGL] 体积云实现探索

这个云是可以调厚的,目前主要是采样的总步长不足所以比较薄,但当然会很卡,目前用的电脑没有显卡我就没有尝试截图了 5.5更新:换了台有显卡的电脑截了个动图 首先,从云的形状开始。由于云的形状是不规则的,在图形学中,为了模拟这种不规则,我们通常使用噪声来实现。 我们使用两种不同的噪声来模拟云的形状——w...

2019-05-01 14:27:05 5187 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除