虚幻引擎之浅谈SceneViewExtension
前言 我们都知道虚幻引擎是一个非常强大且使用广泛的商业引擎,在虚幻引擎的强大的渲染能力加持下,只要有质量足够好的模型,一个新手都可以得到非常逼真的渲染场景。 但是如果你是一个图形开发工程师,在虚幻引擎中定制自己的渲染过程是非常麻烦的,很有可能涉及到修改虚幻引擎的源代码,那这样一个很简单的修改调试起来都会非常的麻烦。(想起来之前做UE项目的时候,只要有引擎相关的代码更新,我们本地编译基本上就是2、3个小时起了,基本上干不了活。) 在这方面Unity的URP的灵活性就要好很多,也许是引擎的设计理念不同,Unity的可能更多的是面向技术人员,需要有更多的图形学技术能力以及自定义能力;而虚幻引擎可能更多的面向美术和设计人员,更多的是使用蓝图来实现多样的效果,提供统一且强大的渲染管线。 在虚幻引擎4.12版本中,Epic引入了SceneViewExtension,它为开发者提供了一种在场景渲染过程中插入自定义渲染逻辑的方式,通过它可以实现很多自定义渲染效果,比如后处理效果、自定义的调试信息显示等。这种机制允许开发者在不直接修改引擎核心渲染代码的前提下,扩展和定制渲染流程。 在网上Scene...
vulkan阴影贴图实践总结
前言 好了,继续我们的Vulkan之旅。 在上一次Vulkan相关的文章中,我们利用subpass实现了延迟渲染的流程。 延迟渲染实现之后,下一步当然是实现阴影了,缺少了阴影的场景看起来还是差点意思。于是乎我自然而然的计划将阴影贴图的实现提上日程。 阴影贴图的原理我这里就不再多介绍了,和OpenGL的实现原理是一致的。我们之前的文章也有介绍过阴影贴图的各种延展应用,比如说CSM(级联阴影贴图)和rsm(反射阴影贴图)。 本来想着的是我都实现过几次阴影贴图了,那这次Vulkan的接入也应该很快才对,结果由于各种各样的生活和工作的事件影响,再加上Vulkan上面有许多的细节需要调整,导致这个效果拖了大半个月才算弄好。 这篇文章简单记录一下我实现过程中踩的各种坑。 Vulkan实现阴影贴图过程中踩的坑 准备深度纹理 在准备深度纹理上就有不少细节需要关注。 VkImageCreateInfo.Usage 首先在创建深度纹理的时候,VkImageCreateInfo中的Usage需要添加采样的Flag位。这一位在延迟渲染和天空盒等没有直接对深度纹理采样的过程中是不需要添加的,只有Colo...
虚幻引擎之Android环境配置
前言 最近工作又出现了变动,去年我这个快十年游戏客户端和引擎开发经验的被调去做AI后端,迷茫了一年后今年又要被调去做安卓Native C++开发了,真的是这两年转的方向比我原来工作七八年的时间都要多。 不过至少安卓Native C++开发比后端开发更加贴合我的工作了,说不定也是件好事。周末闲来无事,想着我好像从来没有自己构建过UE的安卓工程,打算来走走这个流程。 构建安卓环境 Android Studio 要构建安卓包,首先需要下载Android Studio,在官网下载后安装即可。 安装完运行Android studio,第一次打开会做Studio的初始化,需要安装一些默认的组件,选择需要的(一般是提示的都选了)的后等待下载安装完成即可。 然后我们会进到Android Studio的欢迎界面,由于我们一般不用Android Studio来开发UE的工程,这里我们不打开我们的C++代码目录,而是直接打开More Actions->SDK Manager,在弹出来的设置界面中,选择SDK Tools,勾选NDK(Side by side)和Android SDK Comma...
Vulkan中利用subpass实现延迟渲染
前言 这又是一张平平无奇的渲染图,和上一篇文章的那张图片好像也没什么区别。从表面上看是的,在渲染效果上这张图片没有什么进步,但是这张图片是用了另外的技术实现的,也就是延迟渲染。 延迟渲染这个概念在网上有很多的资料,我也在我之前的一篇文章介绍过,所以这篇文章我不会再对延迟渲染的概念做介绍。今天这篇文章的主要内容,是如何在Vulkan中实现这个效果。 在Vulkan中实现延迟渲染 当然,延迟渲染的原理是一样的,无论是用Vulkan还是OpenGL,大概分为两个步骤: 几何阶段和光照阶段。在几何阶段搜集画面中用于光照计算的信息。 传输到光照阶段计算出最终的结果。 既然Vulkan和OpenGL实现是差不多的,为什么这里还有专门写一篇文章呢?因为在Vulkan中,可以利用RenderPass中的subpass,来将两个步骤放到同一个render pass中,这样可以减少延迟渲染两个阶段之间的额外数据处理和传输,从而提升性能。 Vulkan中的Render Pass和Subpass 在Vulkan里,Render Pass(渲染过程)是一个十分关键的概念,它对渲染操作的整体结构和流程...
Vulkan接入小总结
前言 这是一张平平无奇的渲染图,没有阴影,没有IBL,也没有反射等各种酷炫高大上的效果。 但这张平平无奇的渲染图是我断断续续花了一个月的时间才完成的结果:这是KongEngine接入Vulkan后得到的最新效果。在前面的几篇文章我也提到过,我最近一直在处理这个事,为此我将KongEngine的渲染代码重构,并将Vulkan整合进来。当然原有的OpenGL能力我还是保留着,目前的目标是先利用Vulkan还原原有的OpenGL效果。 这篇文章也不是什么Vulkan入门教程,不会系统的讲Vulkan的初始化流程是怎么样的,Render Pass和Pipeline是什么,DescriptorSet要怎么设定等等。这些内容太复杂了,很难在一篇文章内讲清楚,况且我现在也不能说是很精通。这篇文章只是会大概介绍一下KongEngine目前的Vulkan结构。 KongEngine的Vulkan结构 如下图所示: KongEngine目前将图形API的部分整合了起来,封装成了OpenGL部分和Vulkan的部分。目前这两个部分的流程还是有一定的区别,本来按照原有计划是将OpenGL的渲染流程按...
基于图像的光照-镜面反射
前言 上一篇文章介绍了IBL的漫反射部分,接下来这篇文章关注的是镜面反射的部分,也就是拆分方程的后面部分。 分割求和近似法 我们回到反射方程的镜面反射部分: $$L_o(p, \omega_o) = \int_{\Omega} \left(\frac{k_s DFG}{4(\omega_o \cdot \mathbf{n})(\omega_i \cdot \mathbf{n})}\right) L_i(p, \omega_i) \mathbf{n} \cdot \omega_i , d\omega_i$$ 我们发现这个积分的结果在积分上不是常数,他受入射光和观察视角两个因素影响。如果对所有入射光方向和所有可能的视角方向做积分,这个计算消耗十分昂贵,是没有办法这么做的。 为了解决这个问题,Epic Games提出了一个解决方案,叫做分割求和近似法。它将方程的镜面部分分割成了两个独立的部分,分别对这两个部分求卷积,并在PBR着色器重求和,用于IBL的镜面反射部分。 分割求和近似法包含两部分: 预过滤环境贴图:对不同粗糙度的环境光进行卷积,存储为mipmap层级的立方体贴图。 BR...
基于图像的光照-漫反射辐照度
前言 KongEngine的Vulkan接入还在进行中。好消息是已经能够实现一个基本的Vulkan渲染流程,将简单的带有贴图模型渲染到场景中了;坏消息是,这就是他目前利用Vulkan能做到的所有事了。 其实按照目前的进展,是可以准备一篇文章来讲讲接入Vulkan这段时间的一些内容了。不过思来想去,还是计划延后,等更加完善了再来详细说说。为了尽量实现我一周一篇文章的计划,也想填填以前的坑,今天这篇文章打算讲讲基于图像的光照技术:IBL。 什么是IBL IBL 即Image-Based Lighting,是基于物理的渲染(PBR)中一种重要的光照技术。传统的光照计算通常是基于光源的,例如点光源、方向光等,这些光源模型比较简单,难以模拟出复杂的真实世界光照环境。而 IBL 则是利用环境图像(通常是高动态范围图像,HDR)来捕捉场景周围的光照信息,将其作为场景中物体的光照来源,从而为物体提供更真实、更自然的光照效果。 IBL 的核心思想是将环境光照视为无数个微小的光源,这些光源分布在物体周围的各个方向上。通过对环境图像进行采样和处理,可以计算出物体表面从各个方向接收到的光线能量,进而模拟...
OpenGL优化技巧之DSA
前言 最近工作依旧是处于比较繁忙的阶段,由于我突然被委以一项不大不小但是进度十分紧急的任务,导致我每天所能挤出来更新的时间是越来越少了。KongEngine的重构有所进展,现在已经将最基础的模型渲染抽象了出来,并且实现了Vulkan渲染的一个简单流程,但是离最终目标还有一定距离。 以前的一些坑(IBL、SSAO)也没有什么精力来填了,这篇文章打算“水”一期,讲讲一个关于OpenGL优化的非常小的一个方面,Direct State Acess(DSA)。 为了聊明白Direct State Acess(以下简称DSA)是什么,以及为什么它可以作为一种优化OpenGL的方法,我们首先需要理解一个概念,即:OpenGL本质上是一个状态机。 OpenGL本质上是一个状态机 该如何理解这句话呢?我们来思考一下,状态机最核心的组成部分是各个不同的状态,以及状态之间的逻辑转换,对于到OpenGL可以做以下的理解: 状态:OpenGL有大量可配置的状态。例如,绘图模式(点、线、三角形等)、光照模型(是否启用光照、光源位置和属性等)、纹理参数(纹理过滤方式、纹理坐标模式等)、当前绑定的帧缓存以...
Gerstner波形
前言 好久不见,最近正处于工作比较忙的阶段,每天为了应付工作上的事情就已经筋疲力尽了。为了得到更好的渲染效率,KongEngine目前正处于比较大的重构之中。同时最近我开始为KongEngine增加对Vulkan的支持,一起都还处于最初的混沌之中,所以KongEngine的渲染特性目前没有什么增加,没有什么可写的。我计划等一起都尘埃落定在详细的介绍一下。 今天这篇文章,算是对之前水面渲染的一个小小的延伸,也是填了之前埋得一个小小的坑。 生成波浪 我在《水面效果-1》和《水面效果-2》这两篇文章中,我简单介绍了一种水面渲染效果的方法。这种方法最后的结果能输出出不错的水面效果,但是有一个比较大的缺陷就是,这种方法渲染出来的水面是平的。 尽管在这两篇文章中,我们尝试使用了几种方法来让水面产生波纹扰动,包括dudv map和normal map。但是水面的mesh最终只是一个平面,如果你以相对平行的视角去看的话,水面是没有起伏的。 如何解决这个问题呢?那有个很简单的思路,我们只要让水面不只是一个平面,让他是一个有波纹扰动的mesh就可以了。在《水面效果-2》的文章的最后提到了Gerstn...
DeepSeek-R1本地部署
前言 蛇年新年好。最近因为过年有很多其他事情需要忙,KongEngine的重构工作也暂停了,文章也有一阵子没有更新。今天是大年初六,总算是回到了深圳家,自己也可以稍微的放松了一下。 今年过年的这段时间,最大的新闻应该就是DeepSeek了。他前几次模型的发布还不显山不漏水的,这次R1推理大模型的发布和开源不仅仅震动了科技圈、AI圈,而是完完全全的出圈了。我在过年的时候也花了很长时间去使用它的应用,它确实展现了很惊艳的效果,但是由于各方面的原因,它的网站确确实实不够稳定,经常会卡住需要重试。于是我就想尝试着本地部署。 Ollama 这次部署我使用的是Ollama。 Ollama简介 Ollama 是一个开源的本地大型语言模型运行框架,旨在简化在本地运行大语言模型的过程,降低使用门槛。它支持 Llama 2、Mistral、Gemma 等众多主流开源模型,能将模型权重、配置和数据捆绑为 Modelfile 进行统一管理。 Ollama 具有自动硬件加速功能,可充分利用系统硬件资源,还支持多操作系统,提供简单的命令行界面和 REST API,拥有丰富的预构建模型库,具备轻量级、可扩展...








