BlueRose
文章97
标签28
分类7

文章分类

UE5动画重定向核心逻辑笔记

UE5动画重定向核心逻辑笔记

前言

最近研究过了一下UE的重定向逻辑,所以写点笔记作为记录。(IK部分没有去看)

  • FIKRetargetBatchOperation::RunRetarget():编辑器调用的重定向函数。主要是复制对应需要重定向资产并且进行重定向,之后通知UI。
  • FIKRetargetBatchOperation::RetargetAssets():重定向资产逻辑。
    • 复制所有曲线轨道(不含数值)。
    • 设置Skeleton与PreviewMesh资产。
    • 提前调用重定向资产的PostEditChange(),以避免编辑后钩子函数被调用,产生依赖顺序问题。
    • ConvertAnimation()
    • 替换动画蓝图并且编译。
Ubantu平台Puerts编译问题解决

Ubantu平台Puerts编译问题解决

前言

本人使用的版本是Unreal_v1.0.5的Nodejs版本,首先使用Ubantu23.04进行测试,之后换成了Ubantu22.04。Puerts在Ubantu(Linux)上部署的坑也比较多,遂写此文。

UE5 Ubantu & Docker 部署

UE5 Ubantu & Docker 部署

CommonUI学习笔记

CommonUI学习笔记

前言

CommonUI主要解决了层叠式UI输入事件处理、多平台多输入设备管理问题以及控件的激活/卸载。
其中比较重要的机制是CommonUI实现的输入路由功能,其代码位于:CommonGameViewportClient.hCommonUIActionRouterBase.h

官方教学

TextRender显示中文的方法

TextRender显示中文的方法

前言

早几年学习UE的时候发现TextRender渲染中文的时候会出现□的情况,一直都去解决。最近又遇到这个需求了,最终在官方论坛上找到了解决方案,现在分享给大家。

UE5RayTracing篇-2-——Pix与NSight-Graphics补充

UE5RayTracing篇-2-——Pix与NSight-Graphics补充

音乐控制DMX灯光的简单方法

音乐控制DMX灯光的简单方法

前言

最近公司有个活涉及到DMX打光的活,还比较急。为了减少美术同学的压力,所以我就想通过音乐分析+播放Sequence的方式来实现。

UE有自带基于FFT的音乐分析功能,但只能根据频率进行对应的判断,比较麻烦所以放弃了。具体操作可以参考:
https://www.bilibili.com/video/BV1FP411c79v/

UE5 Lyra学习笔记(1)—LyraEditor

UE5 Lyra学习笔记(1)—LyraEditor

LyraEditor

主要的实现内容为:

  • ULyraEditorEngine
  • UCommandlet
  • UEditorValidator
  • 3个全局命令
  • 1个自定义Asset
  • FGameEditorStyle

在FLyraEditorModule启动与载入时,增加GameplayCueNotify类与GameplayCue路径。并且绑定OnBeginPIE()与OnEndPIE()。

UE5 Lyra学习笔记(1)—LyraEditor

UE5 Lyra学习笔记(1)—LyraEditor

前言

ULyraInventoryManagerComponent通过GameFeature功能在模块激活时挂载Controller上,具体可以查看ShooterCore的GameFeature配置文件。
Lyra中的物品系统采用 Entry - Instance - Definition - Fragment的结构。但该系统有没有完成的痕迹,所以个人不建议直接拿来用,但里面有考虑到网络同步的设计值得学习。
与ActionRPG项目相比它没有实现SaveGame/LoadGame部分,也没有使用FPrimaryAssetId来减少网络同步以及存档大小。所以也挺可惜的。

使用Git SubModule来管理开源插件

使用Git SubModule来管理开源插件

前言

之前有考虑过将项目中自己的移植版AdvancedLocomotionSystem v4换成社区维护版本ALS-Community。众所周知,如果主仓库下存在子.git文件夹,那子.git文件夹中的改动主仓库是无法检测到的,除非把子.git删除。但我既想在主项目中使用git来管理版本又想在插件中保留git信息以方便从github中获取最新的改动。查了一番资料,最后发现git已经给出了解决方案:Git SubModule。

UE5RayTracing篇(1)——NSight Graphics

UE5RayTracing篇(1)——NSight Graphics

最近打算开始研究UE的RayTracing,但欲先利其事必先利器,必要的Debug手段还是需要会用。在发现RenderDoc不支持RayTracing后,花了些时间学习了一下NSight Graphics。一般的流程就是使用NSight启动要调试的游戏(项目)进程,之后按F11截帧并使用所需工具查看。下面的章节将会简单介绍一下它的功能。

虚幻商城发布插件指南

虚幻商城发布插件指南

虚幻商城发布插件指南

前段时间本人尝试发布自己写的插件到Market Place,因为每次审核会需要1~3天时间不等,所以在这里分享一下我的经验。

MultiDraw中文文档

MultiDraw中文文档

简介

本插件通过UnrealEngine的MeshDraw框架实现类似Unity的多Pass效果,无需后处理即可实现BackFace描边、剖切效果。并且可以让一个部位同时渲染Unlit与Lit光照模式的Material。

MultiDraw5.0案例项目
MultiDraw5.1及后续版本案例项目
使用方法:下载在Plugins文件中放入MultiDraw,即可运行。
注意:本项目只有5.0及以上版本才可以打开。

MultiDraw Document

MultiDraw Document

Introduction

This plugin uses UnrealEngine’s MeshDraw framework to achieve a multi-Pass effect looks like Unity’s, with no post-processing required to achieve strokes and cutoff.

MultiDraw UE5.0 ExampleProject
MultiDraw UE5.1 and newer versions ExampleProject
Usage:Download this project,and put MultiDraw plugin into plugins folder.
Notice:This project only UE5.0 and higher can run.

中文文档

UE4渲染用贴图资源实时更换

UE4渲染用贴图资源实时更换

最近做卡通渲染,美术同学反应每次更换渲染贴图都需要手动替换资源并重启引擎相当麻烦。所以花时间了解了一下UE4的渲染资源逻辑。并且找到了解决方法。

Ue4后处理逻辑简析

Ue4后处理逻辑简析

APostProcessVolume

通常我们在后处理体积,也就是APostProcessVolume设置后处理效果。它存储了struct FPostProcessSettings Settings;
加入关卡后,会存储在UWorld的PostProcessVolumes中,之后依次调用DoPostProcessVolume=》OverridePostProcessSettings,之后修改FSceneView中的FFinalPostProcessSettings FinalPostProcessSettings。(对所有属性进行插值计算)

最后就可以通过View.FinalPostProcessSettings来读取后处理参数了。

UE4 AI相关模块学习笔记

UE4 AI相关模块学习笔记

前言

本文为本人学习UE4 AI相关模块学习笔记,之前因为没有系统的整理过所以没发出。现在因为某一些原因,又因为懒得整理所以就发了。

其他文档推荐:
UE4场景询问系统浅析(EQS与行为树)
http://www.uejoy.com/?p=500

UE4 AIModule源码阅读之AI感知系统
https://zhuanlan.zhihu.com/p/356716030

UE4通过修改FMeshBatch参数实现反向剔除

UE4通过修改FMeshBatch参数实现反向剔除

之前我有写过两篇通过自定义场景代理来实现描边的文章:
https://zhuanlan.zhihu.com/p/69139579
https://zhuanlan.zhihu.com/p/69156465

当时有一个问题没解决,就是不知道如何将材质设置为反向剔除,因为UE4只有双面渲染选项,毕竟只有卡通渲染等一些非真实渲染才需要这种功能。但经过MeshDraw框架的学习,我发现只需要在场景代理中设置一下FMeshBatch剔除属性即可,而且这个方法没有任何副作用。其他代码可以参考我的插画。效果如图(没有使用深度偏移)


UE4 BasePassPixelShader.usf学习笔记

UE4 BasePassPixelShader.usf学习笔记

BasePassPixelShader.usf中的FPixelShaderInOut_MainPS(),为BasePass阶段Shader的主要逻辑。会被PixelShaderOutputCommon.usf的MainPS(),即PixelShader入口函数中被调用。
该阶段会取得材质编辑器各个引脚的计算结果,在一些计算下最终输出GBuffer,以备后续光照计算。可以认为是“紧接”材质编辑器的下一步工作。相关的c++逻辑位于FDeferredShadingSceneRenderer::Render()的RenderBasePass()中。

但因为个人能力与时间所限,只能写一篇杂乱笔记作为记录,以供后续使用。

UE4 材质编辑器 CustomNode使用技巧

UE4 材质编辑器 CustomNode使用技巧

之前有看过MeshDraw的流程,发现MeshDraw部分还是和材质编辑器帮得死死的。(不过应该可以通过自定义MeshDrawPass、图元类、定点工厂来直接使用VS与PS Shader。不过这样就无法使用材质编辑器进行简单的Shader编写与使用Material Instance来调节参数,只能使用c++进行参数传递非常得不方便)在使用材质编辑器的情况,使用CustomNode可以更多的自由度,比如使用一些UE在ush定义的函数以及循环等;更好的可读性以及方便项目升级与后续项目使用等。

这里我总结了一些CustomNode使用方法。使用CustomNode时最好将ConsoleVariables.ini中的 r.ShaderDevelopmentMode设置为1。这样可以看到更多的Shader错误信息,但老实说UE4的Shader错误提示真心不能与U3D比……

采用CustomNode+Include usf文件的方式,使用Ctrl+Shift+.不会真正的更新代码,必须手动断开节点连接再连接上,才会触发重新编译。

MeshDraw渲染流程学习笔记

MeshDraw渲染流程学习笔记

前言

MeshDraw是UE4用于渲染Mesh相关Pass的框架,他主要用于将Mesh渲染到RT上,之后在RDG中进行进一步的渲染。

使用引擎版本:源码版4.27.0

参考Yivanlee的MeshDraw系列文章。

提升FastBuild编译UnrealEngine的速度

提升FastBuild编译UnrealEngine的速度

在上一篇文章之后我进行了进一步测试,下面是结果。

测试结果

测试配置
i7-8700 3.2Ghz 12线程
16GB内存
WDC PC SN730 SDBQNTY-256G-1001 固态硬盘
ST1000DM003-1SB102 机械硬盘

服务器配置
Inter Xeon Silver 4114 2.2GHz (2处理器)40线程
64GB内存

引擎版本4.27.0 Release
网络:百兆网络

使用Fastbuild加快UnrealEngine编译速度

使用Fastbuild加快UnrealEngine编译速度

如果你有多台电脑或者服务器就可以使用FastBuild提高编译速度。虽然最后测试法线,i7-7700+一台几年前的e5 40核心服务器依然比不过今年买的枪神5笔记本。

如果你完全按照 https://zhuanlan.zhihu.com/p/158400394 的教程来操作,那你就被坑了。目前Fastbuild的最新版本与UE是不兼容的。很可能会出现寻找的目录与FastBuild创建的目录不一致的问题。以下是本人的log:

已启动生成…
1>------ 已启动生成: 项目: UE4, 配置: Development_Editor x64 ------
1>Building UE4Editor and ShaderCompileWorker...
1>Using Visual Studio 2019 14.29.30136 toolchain (D:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133) and Windows 10.0.19041.0 SDK (D:\Windows Kits\10).
1>Detected build type as Windows from 'D:\UnrealEngine\UnrealEngine4.27\Engine\Build\Windows\cl-filter\cl-filter.exe' using search term 'Windows'
1>Using path : {D:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC/Redist/MSVC\14.29.30133} for vccorlib_.dll (MSVC redist)...
1>    ...Add an entry for MsvcCRTRedistVersion in BuildConfiguration.xml to specify a version number
1>FBuild Command Line Arguments: '-monitor -summary -dist -cacheread -ide -clean -config "D:\UnrealEngine\UnrealEngine4.27\Engine\Intermediate\Build\fbuild.bff" -nostoponerror
1>BFF file 'D:\UnrealEngine\UnrealEngine4.27\Engine\Intermediate\Build\fbuild.bff' has changed (reparsing will occur).
1>Using brokerage folder
1>No workers found in '\\DESKTOP-QI1GP15\FastBuildBroker\main\20.windows\'
1>No workers available - Distributed compilation disabled

操作步骤

上述问题是因为当前使用的FastBuild协议版本与UE4所需的不同造成的,所以你需要使用EPIC定制的FastBuild。本人使用Win10与UnrelEngine4.27.0源码版目前正确的操作步骤如下:

  1. 使用源码目录Engine\Extras\ThirdPartyNotUE\FASTBuild\Win64\下的FastBuild。指定一个不含用中文路径的目录。
  2. 在该目录中再新建一个名为FBuild的文件夹,并将3个文件复制进去。这一步是可选步骤,是为了兼容FBDashboard.exe。你可以去FastBuild官网下载,并且指定目录下。(只需要复制FBDashboard.exe,放在FBuild外面)
  3. 创建共享文件夹。添加当前用户与Everyone用户权限为读/写。之后再用其他电脑访问一次,能进入并且写文件就完成了。(只需要其中一台电脑or服务器创建共享文件夹即可,其他所有机器都会使用这个共享文件夹)
  4. 添加环境变量FASTBUILD_BROKERAGE_PATH,内容为共享文件夹的网络路径,比如\\DESKTOP-QI1GP15\FastBuildBroker;Path变量添加FBuild.exe所在目录,之后在CMD中输入FBuild,运行后提示Failed to open BFF 'fbuild.bff'就代表添加成功了。
  5. 在其他电脑与服务器上执行上述步骤。
  6. 添加编译配置。给Engine\Saved\UnrealBuildTool\BuildConfiguration.xml添加bAllowFASTBuild配置为true。

比如这样:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
    <BuildConfiguration>
        <bAllowFASTBuild>true</bAllowFASTBuild>
    </BuildConfiguration>
</Configuration>

共享问题

你很可能会遇到无法打开共享或是网络发现的功能,下面我分享以下解决方法。测试系统:win10、win2012 r2。

  1. 关闭win防火墙。
  2. 在控制面板-程序-启动或者关闭服务器功能中,确保安装了SMB 1.0/CIFS 文件共享支持下的所有功能。
  3. 运行services.msc,启动Computer Browser服务并将启动方式设置为自动。将下列服务启动并将启动方式设置为自动(延迟启动):Function Discovery Provider Host、Function Discovery Resource Publication、Network Connections、UPnP Device Host。

其他注意点

江湖小辈教程中使用FastBuild源码版是为了做测试以及通过修改源代码来实现通过Ip来代替计算机名来寻找共享。如果你想使用最新版本就需要修改FastBuild源码中的distributed protocol version。本人没有试过,但应该是这样没错。

对于团队来说添加DCC、Shader编译也许必须的,所以还可能修改UBT代码。但记住在修改完UBT代码后,需要重新编译UBT。
调试UBT的话,需要在UBT工程上右键-属性-调试页面中,将配置设为Debug,之后添加命行参数,之后在Debug模式下就可以命中断点了。编译UE4源码命令行如下:

UE4Editor Win64 Development -Quiet -WaitMutex -FromMsBuild

编译配置

是一个名为BuildConfiguration.xml的xml文件,用于控制编译。除了可以在项目Config/UnrealBuildTool中添加外。UBT还会从以下位置(Windows系统)的XML配置文件读取设置:

  • Engine/Saved/UnrealBuildTool/BuildConfiguration.xml - 针对特定引擎版本。
  • User Folder/AppData/Roaming/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml
  • My Documents/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml - 适用于所有已安装的引擎版本。

除了上文中说到的bAllowFASTBuild外,因为本人使用附带git信息的引擎源码,编译时UBT会先去读取git信息,但因为源码git信息量太大,非常浪费时间。这里可以添加

<SourceFileWorkingSet> 
    <Provider>None</Provider> 
    <RepositoryPath></RepositoryPath> 
    <GitPath></GitPath> 
</SourceFileWorkingSet>

起到让UBT禁用“使用 ‘git status’ 来确定AdaptiveUnityBuild。下面介绍一下其他参数,完整参数请去官方文档参考。

LocalExecutor

  • ProcessorCountMultiplier:本地执行的处理器计数乘数。设为小于1可为其他任务保留CPU。使用本地执行器(非XGE)时,在每个CPU核心上运行单一操作。注意: 可将该属性设为较大的值,在多数情况下可稍微提高编译速度,但电脑在编译期间的响应速度将变慢。
  • MaxProcessorCount:本地执行的最大处理器数量。

ParallelExecutor

  • MaxProcessorCount:本地执行的最大处理器数量。
  • ProcessorCountMultiplier:本地执行的处理器计数乘数。设为小于1可为其他任务保留CPU。
  • bStopCompilationAfterErrors:启用时,将在发生编译错误后停止编译目标。

我在查看了AnswerHUB看到有人分享了自己的配置:

查阅代码之后发现,这些配置选项要去看 BuildConfigProperties.INT.udn 里的参数,ProcessorCountMultiplier 是在 ParallelExecutor 下的,所以改成以下配置:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
  <ParallelExecutor>
    <ProcessorCountMultiplier>7</ProcessorCountMultiplier>
    <MaxProcessorCount>7</MaxProcessorCount>
    <bStopCompilationAfterErrors>true</bStopCompilationAfterErrors>
  </ParallelExecutor>
</Configuration>

目前我使用的完整配置:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
  <BuildConfiguration>
    <ProcessorCountMultiplier>7</ProcessorCountMultiplier>
    <MaxParallelActions>7</MaxParallelActions>
    <bAllowParallelExecutor>true</bAllowParallelExecutor>
  </BuildConfiguration>
  <SNDBS>
    <ProcessorCountMultiplier>4</ProcessorCountMultiplier>
    <MaxProcessorCount>4</MaxProcessorCount>
  </SNDBS>
  <ParallelExecutor>
    <ProcessorCountMultiplier>7</ProcessorCountMultiplier>
    <MaxProcessorCount>7</MaxProcessorCount>
    <bStopCompilationAfterErrors>true</bStopCompilationAfterErrors>
  </ParallelExecutor>
</Configuration>

FASTBuild

  • FBuildExecutablePath:用于指定 fbuild.exe 的位置(如果发布的二进制文件未使用)
  • bEnableDistribution:控制网络构建分布(network build distribution)
  • FBuildBrokeragePath:用于指定中间件的位置。如为null,则FASTBuild退回检查FASTBUILD_BROKERAGE_PATH
  • bEnableCaching:控制是否使用缓存。仅当该选项启用后,CachePath和FASTCacheMode才会相关。
  • CacheMode:缓存访问模式 - 仅当bEnableCaching为真时相关;
  • FBuildCachePath:用于指定缓存的位置。如为null,FASTBuild会退回检查FASTBUILD_CACHE_PATH
  • bForceRemote:是否强制远程
  • bStopOnError:是否在错误上停止
  • MsvcCRTRedistVersion:使用哪个MSVC CRT Redist版本

UnityBuild

  • bUseAdaptiveUnityBuild:使用启发式方法来确定哪些文件目前正在被迭代,并将它们从unity blobs中排除,从而加快增量编译的时间。目前的实现使用只读标志来区分工作集,假设文件正在被修改,源码控制系统将使其可写。这对Perforce是正确的,但对Git不是。
GAS的TargetData与TargetActor相关机制

GAS的TargetData与TargetActor相关机制

前言

TargetActor是GAS用于获取场景中物体、空间、位移等数据的机制,同时也可以用于制作可视化debug工具。,所以非常有必要掌握它。

一般流程为:使用WaitTargetData_AbilityTask生成TargetActor,之后通过TargetActor的内部函数或者射线获取场景信息,最后通过委托传递携带这些信息构建的FGameplayAbilityTargetDataHandle。

本文部分描述摘自GASDocumentation_Chinese,翻译的还不错,也请大家给此项目点赞。

GAS AbilityTask节点功能整理

GAS AbilityTask节点功能整理

前言

整理了一下GameplayTasks节点,在此分享给大家。

GAS中的传递数据与解耦方法

GAS中的传递数据与解耦方法

一种将所有逻辑都写进Ability的GAS Combo方案

一种将所有逻辑都写进Ability的GAS Combo方案

前言

使用GAS实现Combo技能,本人所知道的有两种思路:

第一种:为每一段Combo创建一个单独的Ability;定制自定义Asset与编辑器,之后再通过自定义编辑器进行编辑。

  • 优点:最高的自由度,不容易出问题。
  • 缺点:如果有大量多段或者派生复杂的Combo,那工作量将会相当爆炸。可以说除了工程量大,管理麻烦没有别的缺点。

第二种:根据GameplayEvent直接在Ability里直接实现Combo切换逻辑

https://zhuanlan.zhihu.com/p/131381892

在此文中,我分析了ActionRPG的攻击逻辑的同时自己也提出一种通过GameplayEvent实现Combat的方法。这个方法理论上没问题,但实际落地的时候发现存在一个问题:里面使用的PlayMontageAndWaitEvent是GameplayTasks是异步运行的,而通过AnimNotify发送的SendGameplayEvent的函数确是同步函数。所以会导致PlayMontageAndWaitEvent节点接收不到任何事件的问题。经过一段事件的探索,本人摸索到了另一种方案:

  • 优点:一个起点(这个Combo树)一个Ability,方便管理。可以尽可能地把Combo相关的逻辑都整合到一个Ability里。
  • 缺点:自由度会有一定的限制;因为采用异步函数来管理事件,会导致一定的延迟。不适于格斗游戏这种对低延迟要求比较高项目。

2021.7.30更新

如果你使用GAS的输入绑定系统,即在GiveAbility()注册时进行输入绑定(参考GASDocument的4.6.2章节)。可将后面介绍的ListenPlayerInputAction节点换成GAS自带的WaitInputPress或WaitInputRelease。

在联机项目中使用GAS的注意点

在联机项目中使用GAS的注意点

前言

大多数人应该是会通过学习UE4的ActionRPG项目来入门GAS框架的。但在最近自己做Demo的过程中才发现里面的部分不适用网络联机。比如ActionRPG将Character与Controller的指针存在GameMode,因为Server与Client只有一个GameMode的关系,就不符合多人联机游戏的规则。所以在经过实践之后这里我分享一些要点仅供抛砖引玉。这里我再推荐各位读者去看一下GASDocument以及附带的工程,它展现了正确的设计思路。

Slate学习笔记(一):Slate动态控制与其他技巧

Slate学习笔记(一):Slate动态控制与其他技巧

前言

最近在写MessageBox控件,想兼容UMG与c++中调用Slate。略有心得,遂有此文。

为Qt中的SQLite添加密码并加密

为Qt中的SQLite添加密码并加密

前言

因为Sqlite的源代码中只提供了Sqlite3_key()的接口,没有实现。所以Qt中的Sqlite没有密码功能。于是我找了一下资料,,并且总结一下思路。现成的方法在最后。

在Ue4中实现对二次元模型进行透视校正

在Ue4中实现对二次元模型进行透视校正

前言

之前想使用UE4实现IOchair通过Blender晶格变形,实现的二次元角色面部透视矫正效果。在使用HLSL写了1/3晶格效果和IOchair沟通后,才发现这个功能只需要通过在摄像机坐标系下调整模型顶点的Z值即可。但要在Ue4的材质编辑器中实现这个功能就必须知道Ue4的VertexShader处理过程,于是我花了些时间研究了一下。

效果实现思路
一句话解释就是在模型的顶点坐标转换到摄像机坐标后,在乘以投影矩阵前对其Z值进行调整,以实现纸片人的效果。

image

参考了以下这篇文章:
https://zhuanlan.zhihu.com/p/268433650?utm_source=ZHShareTargetIDMore

UE4剖切效果实现

UE4剖切效果实现

前言

思路是使用平面方程来判断模型裁切,之后在另一面使用UnLit的自发光材质显示剖面。但Ue4的BlendingMaterialAttributes不能指定UnLit作为ShaderModel。所以可以使用我之前开发的多Pass插件搞定。

UE4.25传统渲染方式的代码迁移指南

UE4.25传统渲染方式的代码迁移指南

RenderDependencyGraph学习笔记(三)——在插件中使用PixelShader

RenderDependencyGraph学习笔记(三)——在插件中使用PixelShader

前言

在插件中使用RDG调用ComputeShader的方法,我花了没几天就搞定了。但PixelShader相对来说就麻烦了,怎么搞都没有绘制到RT上。最后还是通过改写DrawFullscreenPixelShader的代码搞定了。

另外说一下PixelShader的调用和传统的GlobalShader调用很相似。

RenderDependencyGraph学习笔记(二)——在插件中使用ComputeShader

RenderDependencyGraph学习笔记(二)——在插件中使用ComputeShader

前言

UE4 RDG(RenderDependencyGraph)渲染框架本质上是在原有渲染框架上基础上进行再次封装,它主要的设计目的就为了更好的管理每个资源的生命周期。同时Ue4的渲染管线已经都替换成了RDG框架了(但依然有很多非重要模块以及第三方插件没有替换),所以掌握以下RDG框架还是十分有必要的。

上一篇文章已经大致介绍了RDG框架的使用方法。看了前文的资料与官方的ppt,再看一下渲染管线的的代码基本就可以上手了写Shader。但作为一个工作与Ue4一点关系的业余爱好者,用的2014年的电脑通过修改渲染管线的方式来写Shader不太现实,编译一次3小时真心伤不起。同时google与Epic论坛也没有在插件中使用RDG的资料,所以我就花了些时间探索了一下用法,最后写了本文。因为非全职开发UE4,时间精力有限,不可避免得会有些错误,还请见谅。 代码写在我的插件里,如果感觉有用麻烦Star一下。位于在Rendering下的SimpleRDG.cpp与SimpleRenderingExample.h中。

https://github.com/blueroseslol/BRPlugins

首先还是从ComputeShader开始,因为比较简单。

RenderDependencyGraph学习笔记(一)——概念整理

RenderDependencyGraph学习笔记(一)——概念整理

前言

RDG = Rendering Dependency Graph

RDG主要包含两个重要组件,一个是FRDGBuilder,负责构建Render graph的资源及添加pass等,构建RenderGraph。另一个是FRDGResource,RenderGraph的资源类,所有资源都由它派生。

官方入门ppt:https://epicgames.ent.box.com/s/ul1h44ozs0t2850ug0hrohlzm53kxwrz

因为加载速度较慢,所以我搬运到了有道云笔记:http://note.youdao.com/noteshare?id=a7e2856ad141f44f6b48db6e95419920&sub=E5276AAD6DAA40409586C0552B8E163A

另外我还推荐看:
https://papalqi.cn/index.php/2020/01/21/rendering-dependency-graph/
https://zhuanlan.zhihu.com/p/101149903
本文也将引用上文中的若干内容。

注意

  1. 本文为了便于理解,把诸如typedef FShaderDrawSymbols SHADER;这种类型别名都改成原本的类型名了。
  2. 本文属于本人边学边写的学习笔记,不可避免地会有错误。如有发现还请指出,尽请见谅。
Ue4中的场景物体融合方式与优化

Ue4中的场景物体融合方式与优化

前言

突然想起几个月前在Quixel发布的一篇技术文章,里面归纳了几个场景物体融合方式(主要是与地形融合),甚是不错。隧简单翻译并分享给大家。

原文地址:https://quixel.com/blog/2020/1/22/blending-megascans-assets-in-ue4?utm_campaign=Tutorials&utm_source=youtube&utm_medium=social&utm_content=Goddess%20Temple%20in%20UE4:%20Lighting%20%26%20Blending

这里使用MegaScans中的”Damp Soil”、”Cut Grass 2×2 M”与”Grass Clumps”资产。

Hexo笔记与Blog资源

Hexo笔记与Blog资源

若干写Hexo时所作的笔记。

Ue4Config方法总结与另外一种GameplayTag管理方法

Ue4Config方法总结与另外一种GameplayTag管理方法

前言

最近在尝试对GameplayAbility进行插件化处理。这么做好处在于这样可以方便后续项目的迭代。UE4官方频道有一个“盗贼之海”团队的经验分享视频,他们说制作的GAS Asset复用率能都达到90%,这可是相当惊人的程度。而且在不断地项目迭代过程中,使用GAS制作的技能、Buff/Debuff会越来越充分。从而加快后续项目的开发速度。所以将GAS插件化是很有必要的。

但使用GAS需要给项目添加一些项目设置比如:AssetManager中的DataAsset、指定AssetManager类、添加GameplayTag。在发现网上的添加配置方法无效后,我又花了一些时间研究,终于找到方法,隧有了此文。

AdvancedLocomotionV4学习笔记(5)——FootIK实现

AdvancedLocomotionV4学习笔记(5)——FootIK实现

前言

AdvancedLocomotionV4在FootIK的实现中主要使用Transform Bone设置骨骼位置与虚拟骨骼,最终使用Two Bone Ik完成效果设置。除此之外还使用曲线来控制IK与动画的过度。

AdvancedLocomotionV4学习笔记(4)——8方向运动

AdvancedLocomotionV4学习笔记(4)——8方向运动

前言

之前研究一AdvancedLocomotionV4的8方向运动,就是旋转模式中的LookingDirection与Aiming方式。AdvancedLocomotionV4没有直接使用BlendSpace对8方向动作进行融合,而是手动构建了自定义的融合方式,本质上是将一个4方向运动动画融合成8方向。
PS4 的血源诅咒在8方向运动上做的不是很好,如果尝试做出360度锁定运动就会硌脚的现象。其原因是没有前后运动切换过度动画。这里我们看一下AdvancedLocomotionV4的实现方式

GameplayAbility中的Debug方法

GameplayAbility中的Debug方法

VSCode UE4辅助编码插件——Sleeping Forest

VSCode UE4辅助编码插件——Sleeping Forest

如何离线安装VisualStudio2019专业版

如何离线安装VisualStudio2019专业版

AdvancedLocomotionV4学习笔记(3)——思路整理

AdvancedLocomotionV4学习笔记(3)——思路整理

前言

AdvancedLocomotionV4是一个不错的Ue4动画项目,它的动画蓝图的层级结构与数据处理结构可以说是教科书级别,不管是拿来学习,还是直接拿来做项目都是不错的选择。本人通过将这个项目手动移植到自己的Demo中进行学习,现写此文作为学习笔记并分享给打算学习该项目者。在大致了解这个项目的思路以后不但可以少走一些弯路,提升学习速度,而且可以将这个设计思想用在公司的其他项目中。

AdvancedLocomotionV4学习笔记(2)——AnimModifier

AdvancedLocomotionV4学习笔记(2)——AnimModifier

前言

在AdvancedLocomotionV4中大量使用同步组、AnimNotify、AnimationCurve。但那么多动画Asset都要手动添加,我肯定是拒绝的。
image

幸亏Ue4在4.16推出了AnimModifier功能以进行自动化操作。

文档地址:
https://docs.unrealengine.com/en-US/Engine/Animation/AnimModifiers/index.html

本人有幸找到了一篇相关Blog:
http://www.aclockworkberry.com/automated-foot-sync-markers-using-animation-modifiers-unreal-engine/

并以此为基础编写了生成LocoMotion相关同步组、AnimNotify、AnimationCurve的AnimModifier(主要还是因为作者写的东西不太行),并且已经将其放入之前写的插件中,如觉得好用请给我点赞

https://github.com/blueroseslol/BRPlugins

image

AdvancedLocomotionV4学习笔记(1)——动画节点

AdvancedLocomotionV4学习笔记(1)——动画节点

前言

本人最近在学习AdvancedLocomotionV4,并尝试将其中可用部分移植到自己的项目上。在此分享一些自己的心得。

Maya动画批量重定向插件及Python开发插件笔记

Maya动画批量重定向插件及Python开发插件笔记

前言

前段时间研究使用Maya重定向动画,但一个一个手动操作还是有点心烦,所以我花了2天时间学习了Pyhton并写了这个插件(本人有c++、qt、JavaScript经验所以学的快),在这个过程也积累了一些心得在此分享给大家。另外祝大家劳动节快乐。

以下是我写的插件,一个通过HumanIK批量重定向动画的工具:
https://github.com/blueroseslol/DccTool

可以帮助动画公司将biped骨骼动画批量重定向到Ue4或者其他骨骼上。里面有很多HumanIK控制代码以及文件导入与导出代码可以参考。如果有什么问题欢迎交流。

外包过程中的动画重定向以及蒙皮调整经验

外包过程中的动画重定向以及蒙皮调整经验

前言

本人最近给自己的Demo外包了若干角色动画,也遇到了一些坑。所以这里给大家分享一下相关经验,避免大家再次采坑,尤其是那些缺乏经验、精力的独立游戏制作者。当然本人对3DMax完全不熟悉,大部分信息都是本人与外包大哥沟通过程中产生的个人认知,如有错误还请指正,谢谢。

PS.本人因为布料碰撞问题导致重新导入6次角色,包括绘制布料、设置碰撞与编写动画蓝图。真是太痛苦了!

ActionRPG中的攻击逻辑与其他实现方法

ActionRPG中的攻击逻辑与其他实现方法

ActionRPG中的逻辑

逻辑位于BP_PlayerCharacter中,通过按键事件执行ActivateAbilitiesWithTags(定义于ARPGCharacterBase,本质上是执行AbilitySystemComponent的TryActivateAbilitiesByTag函数)、ActivateAbilitiesWithItemSlot(定义于ARPGCharacterBase,本质上通过查询ItemSlot来激活对应的Ability,使用了AbilitySystemComponent的TryActivateAbility函数)来施放“Ability”。

Ue4FaceARSample以及其他iphone面捕方案笔记

Ue4FaceARSample以及其他iphone面捕方案笔记

扩展UProgressBar以实现多重进度条控件

扩展UProgressBar以实现多重进度条控件

前言

因为本人想制作一个类似血源诅咒Demo的关系,所以需要实现一个类似的进度条。它的不同之处在于血量的进度条会显示实际血量与下次攻击后的最大回复血量。也就是一个进度条显示两个量。

UProgressBar为UMG进度条空间,它本质上对Slate组件SProgressBar的封装。负责绑定数据、UI更新。所以我们应该先了解SProgressBar的绘制过程。

ActionRPG的存档与物品系统笔记

ActionRPG的存档与物品系统笔记

前言

ActionRPG在RPGType.h定义了各个类型,在RPGControllerBase类中定义背包逻辑。存档逻辑写在RPGGameInstance与RPGSaveGame中。

个人建议:如果你打算制作个人项目,这里的代码基本不用改,直接就可以用。当然最好还是将共用部分封装成插件,这样后续Ue4项目也可以使用。这也是官方GameplayAbility视频教程中所建议的。

使用Ornatrix来制作Ue4头发流程学习笔记(二)——引导曲线头发

使用Ornatrix来制作Ue4头发流程学习笔记(二)——引导曲线头发

前言

4.24出了头发渲染与模拟功能,这真是一件令人兴奋的事,所以我稍微花了点时间进行测试,在此分享一些经验。

使用Ornatrix来制作Ue4头发流程学习笔记(一)——面片头发

使用Ornatrix来制作Ue4头发流程学习笔记(一)——面片头发

前言

本文仅为使用Ornatrix制作角色头发的流程笔记,只为记录制作流程。但因为本人非专职美术,没有分析过面片头发,也没有制作头发经验,所以本文仅供参考。

[FestEurope2019] 蓝图深入探讨Blueprints In-depth——学习笔记

[FestEurope2019] 蓝图深入探讨Blueprints In-depth——学习笔记

前言

就如大钊所说的,这个视频不管程序还是美术都值得学习一下。

笔记灯光知识与流程学习(五)——推荐流程、灯光Fake与部分问题解决

笔记灯光知识与流程学习(五)——推荐流程、灯光Fake与部分问题解决

前言

在这一章我将会翻译一些我个人觉得有用的文章以此来作为这个系列的结尾。

本文图较多,手机党请注意。本文仅作为个人笔记使用,不保证所有操作都是正确的,请各位谨慎阅读

灯光知识与流程学习总结(四)——动态光照属性与工作流程

灯光知识与流程学习总结(四)——动态光照属性与工作流程

前言

动态光照需要使用多种照明技术协同工作,这一点与只需要LightMass的静态光照不同。所以这一章,我将会总结一些有关动态光照相关的参数、使用场景与设置技巧。

灯光知识与流程学习总结(三)——静态光照属性与工作流程

灯光知识与流程学习总结(三)——静态光照属性与工作流程

前言

在这一章,我将会总结一些有关静态光照相关的参数、使用场景与设置技巧。

本文图较多,手机党请注意。本文仅作为个人笔记使用,不保证所有操作都是正确的,请各位谨慎阅读。

灯光知识与流程学习总结(二)——设置天光与曝光设置

灯光知识与流程学习总结(二)——设置天光与曝光设置

天光

天光亮度一般来说还是保持为1比较好,但以天光作为主要照明是例外(夜晚场景)。
天光有“场景捕获”与“使用CubeMap”两种使用方向。(但是本质上还是围绕着CubeMap,所以作者更加倾向于使用CubeMap。除非你实现了类似CryEngine的昼夜交替系统。)

Daedalus51在视频1.1最后讲解了Skylight技巧,推荐大家去看。

灯光知识与流程学习总结(一)——建立初始场景与材质检查

灯光知识与流程学习总结(一)——建立初始场景与材质检查

前言

本文是对于《Daedalus51的灯光学院系列视频》、《Lighting with Unreal Engine Masterclass视频》、《Ue4照明技术引导系列视频》的总结。相关网址与链接可以参看前一篇文章。

撰写本文时,《Daedalus51的灯光学院系列视频》只看完第一章,所以本文后续还会更改,请各位读者注意。另外因为本人技术能力有限,如有错误还请各位指正。

UE4灯关相关学习资料系

UE4灯关相关学习资料系

前言

分享一些灯光学习资料。

AssetManager系列之Asset Bundles

AssetManager系列之Asset Bundles

Asset Bundles

Asset Bundles(资源束)可以理解为给特定主资源中的次级资源设置“组”,方便你通过“组名”对加载指定组的次级Asset。

AssetManager系列之TAssetPtr与FStreamableManager

AssetManager系列之TAssetPtr与FStreamableManager

TAssetPtr

因为在wiki上已经有介绍TAssetPtr的内容了,所以我就直接翻译了,并且在末尾给予一定的补充。以下是翻译自wiki的内容:

一般情况下,我们无需将这个场景中所有Asset都加载了再进入游戏,我们可以先加载必要Asset,在进入场景后,异步加载剩余的非必要资源。而TAssetPtr可以解决这个问题。TAssetPtr类似于标准指针,其区别在于TAssetPtr指向的资产可能已经加载,也可能还没有加载,如果资产没有加载,则它包含加载该资产所需的信息。(TAssetPtr属于弱指针)

一个简单的引用Asset的方法就是创建带有UProperty标记的TAssetPtr成员变量,并且在编辑器中指定想要加载的Asset。本质上是TSoftClassPtr,包含了FSoftObjectPtr对象。可以通过FSoftObjectPath构造,并用其监视Asset的状态

AssetManager系列之actionRPG项目中的RPGItem类

AssetManager系列之actionRPG项目中的RPGItem类

前言

AssetManager是一个全局单例类,用于管理各种primary assets和asset bundles。配合配套工具 “(Reference Viewer)、“资源审计(Asset Audit)”可以理清Pak文件中Asset的依赖关系以及所占用的空间。

自定义AssetManager可以实现自定义Asset、自定义Asset载入逻辑与控制(异步与同步载入、获取载入进度、运行时修改载入优先级、运行时异步加载强制等待等)、通过网络下载Asset并载入、烘焙数据分包(打包成多个pak)。

在actionRPG项目中通过继承UPrimaryDataAsset来实现自定义DataAsset文件(content browser中能创建的Asset),具体请参照RPGItem,其中包含了包含了文字说明(FTEXT)、物品图标(FSlateBrush)、价格(int32)、相关能力(UGameplayAbility),具体的之后会介绍。

GameplayTag、Event与GameplayCue

GameplayTag、Event与GameplayCue

简述

GameplayAbility框架使用GameplayTag作为各种状态判断的依据,甚至使用它作为Event进行传递。

UAbilityTask

UAbilityTask

UAbilityTask

UAbilityTask继承自UGameplayTask(UGameplayTask可以用来写一些行为树中的一些节点),可以用来实现一些异步功能。比如播放montage后各种事件的处理。

你可以去GameplayAbilities\Public\Abilities\Tasks\目录下寻找作者编写的task类作为相关参考,也可以直接使用(GameplayTasks目录下的案例比较少)。

当然我更加推荐学习actionRPG项目中的PlayMontageAndWaitForEvent,原因有:1、这个task用得最多2、涉及Task的代码相对较多。

其他推荐学习的:UGameplayTask_WaitDelay、UAbilityTask_WaitGameplayEvent、UAbilityTask_WaitGameplayTagAdded、UAbilityTask_WaitGameplayEffectApplied

UGameplayAbility

UGameplayAbility

UGameplayAbility

UGameplayAbility在GameplayAbility框架中代表一个技能(也可以认为是能力,它可以事件主动或者被动技能),我们可以通过继承UGameplayAbility来编写新技能。

UGameplayAbility主要提供以下功能:

  • 使用特性:技能cd、技能消耗等
  • 网络同步支持
  • 实例支持:non-instance(只在本地运行)、Instanced per owner、Instanced per execution (默认)

    其中GameplayAbility_Montage就是non-instanced ability的案例,non-instanced在网络同步中有若干限制,具体的参考源代码。

UGameplayEffect

UGameplayEffect

UGameplayEffect

UGameplayEffect在框架中主要负责各种数值上的效果,如果技能cd、类似黑魂中的异常效果堆叠与buff,甚至连角色升级时的属性点添加都可以使用它来实现。

因为大多数逻辑都是设置数据子类的操作,所以对于这个类,本人推荐使用蓝图来进行操作。

UAttributeSet

UAttributeSet

概述

在GameplayAbility框架中,UAttributeSet负责管理各种属性。

开始编写GameAbility相关逻辑

开始编写GameAbility相关逻辑

前言

本人最近看了GameplayAbility的wiki与官方的ActionRPG案例,大致对此有了一定了解。所以在此分享相关经验顺便作为学习笔记。

wiki采用了第三人称模板来进行讲解。讲解了几个主要类的概念、参数以及用法。

ActionRPG则是一个较为完整的案例:它通过c++ 往几个GameplayAbility的基础类中添加了若干逻辑,使得之更加适合于RPG项目。大部分改动都很不错,甚至直接复制,让它作为你的RPG模板都是没问题。它的主要逻辑以及表现都在于蓝图中(技能与效果),所以它也是一个c++与蓝图结合开发的好例子。(注意:GameAbility无法完全通过蓝图开发)

所以接下来我也会适当讲解actionRPG的结构。

注意:有关网络同步的我都会略过。

使用Gitlfs对uasset、umap等二进制文件进行版本管理

使用Gitlfs对uasset、umap等二进制文件进行版本管理

前言

因为GameplayAbility属于蓝图c++混合编程框架,所以对蓝图类与地图进行版本管理是十分重要的事情。所以本文将在这里介绍git的二进制文件版本管理方案。

基于插件的StaticMesh多Pass绘制方案

基于插件的StaticMesh多Pass绘制方案

前言

StaticMesh与SkeletalMesh的实现方法比较类似,不过两者的绘制方式有很大的不同。不过庆幸的是,Static的MeshBatch设置在绘制函数的外面。

基于插件的SkeletalMesh多Pass绘制方案

基于插件的SkeletalMesh多Pass绘制方案

本文仅供抛转引玉,为大家提供一个可行思路。因为本人目前仅仅是个Ue4业余爱好者,手头没有含有Lod的骨骼模型做测试,所以请勿在未测试的情况下直接把本插件用于生产。

Qt On Android 隐藏状态栏的方法

Qt On Android 隐藏状态栏的方法

注意点

隐藏状态栏时,第一个界面不能使用Qt设计师界面类(创建项目时,不勾选创建界面选项)。不然以下方法皆会无效。

UTexture2D的读取与写入数据并且保存成Asset

UTexture2D的读取与写入数据并且保存成Asset

UTexture2D的读取与写入数据

在阅读@YivanLee的文章
https://zhuanlan.zhihu.com/p/45171840

我发现“向UTexture2D写入数据”这节有些纰漏:

  1. 作者没有说明Texture2D->PlatformData->Mips[0].BulkData.LockReadOnly()返回空指针的详细情况。
  2. 作者实现的写入是临时性的。

在查阅国外资料时,我在isaratech的网站里找到解决方案,在此我将进行简单说明。(原文地址在结尾会介绍)

(虚幻4Shader篇)开始编写ComputeShader

(虚幻4Shader篇)开始编写ComputeShader

本文的大部分代码参考@YivanLee的文章,特此说明

有关ComputeShader的原理解释可以参考:https://zhuanlan.zhihu.com/p/36697128
这从此文可以得知ComputeShader是并行渲染的,所以需要设定UnbindBuffers。他与别的Shader通过RenderTarget交换数据。

(虚幻4Shader篇)向Shader传递数据

(虚幻4Shader篇)向Shader传递数据

基础类型数据

Shader中的基础类型数据,例如:int、float4等的传入方式如下:

  1. 在你声明的Shader类中声明FShaderParameter变量。
  2. 在构造函数中绑定Shader中的变量。
  3. 在序列化函数中添加声明的FShaderParameter变量。
  4. 实现自定义的设置Shader变量函数,并在最终绘制前调用。
(虚幻4Shader篇)开始编写最简单的Shader

(虚幻4Shader篇)开始编写最简单的Shader

前言及学习建议

本人最近在学习UnrealEngine的GlobalShader,在这个过程中阅读了@YivanLee的Shader系列文章,大大提高了学习速度。但这些代码大多基于4.19,其中部分代码将会被废弃,所以我撰写这篇在此分享4.22版本的GlobalShader相关经验。

本文意在理顺思路,教会读者如何搭建基础的Shader测试环境,顺便总结学习心得,所以本文不会将所有代码贴出,详细代码请参考github。

大部分内容解释还请参看了@YivanLee的文章,我认为重复造轮子没有意义。具体代码可以参考我的github,读者可以按照commit一步一步学习代码:

https://github.com/blueroseslol/BRPlugins

PBRT读后感与阅读建议

PBRT读后感与阅读建议

看懂PBRT需要有一定c++ 基础,并且对c++11有一定了解。一定的数据结构基础。

PBRT笔记(14)——光线传播2:体积渲染

PBRT笔记(14)——光线传播2:体积渲染

传输公式

传输方程是控制光线在吸收、发射和散射辐射的介质中的行为的基本方程。它解释了第11章中描述的所有体积散射过程——吸收、发射和内、外散射。并给出了一个描述环境中辐射分布的方程。光传输方程实际上是传输方程的一个特例,由于忽略参与介质而进行简化,并专门用于从表面散射。

PBRT笔记(13)——光线传播1:表面反射

PBRT笔记(13)——光线传播1:表面反射

采样反射函数

BxDF::Sample_f()方法根据与相应的散射函数相似的分布来选择方向。在8.2节中,该方法用于寻找来自完美镜面的反射和透射光线;在这里讲介绍实现其他类型的采样技术。

PBRT笔记(12)——蒙特卡洛积分

PBRT笔记(12)——蒙特卡洛积分

这里还涉及到pdf、方差等概念,推荐去看《全局光照技术:从离线到实时渲染》
积累分布函数 cumulative distribution function (CDF)

PBRT笔记(11)——光源

PBRT笔记(11)——光源

自发光灯光

至今为止,人们发明了很多光源,现在被广泛使用的有:

  1. 白炽灯的钨丝很小。电流通过灯丝时,使得灯丝升温,从而使灯丝发出电磁波,其波长的分布取决于灯丝的温度。但大部分能量都被转化为热能而不是光能。
  2. 卤素灯,在灯中充入惰性气体,使得灯的寿命增加,与白炽灯一样使用钨丝。
  3. LED灯
PBRT笔记(10)——体积散射

PBRT笔记(10)——体积散射

体散射类型

3个影响参与介质在环境中的辐射度分布的主要因素:

  1. 吸收:减少光能,并将其转化为别的能量,例如热量。
  2. 发光:由光子发射光能至环境中。
  3. 散射:由于粒子碰撞,使得一个方向的辐射度散射至其他方向。
PBRT笔记(9)——贴图

PBRT笔记(9)——贴图

采样与抗锯齿

当高分辨率贴图被缩小时,贴图会出现严重的混淆现象。虽然第7章中的非均匀采样技术可以减少这种混叠的视觉影响,但是更好的解决方案是实现基于分辨率进行采样的纹理函数。

可以在使用贴图时先对贴图的分辨率进行判断,避免采样高分辨率贴图。
为了解决贴图采样函数造成的混淆问题,我们必须解决以下两个问题:

  1. 必须计算贴图空间的采样率,以及获得贴图分辨率,之后就可以计算出屏幕空间的采样率,最后为了获得图元表面的采样率就必须对贴图进行采样,以获得贴图采样率。
  2. 对于给定的贴图采样率,必须使用采样理论去引导计算贴图值,不能有高频的贴图。
PBRT笔记(8)——材质

PBRT笔记(8)——材质

BSDF类

表面着色器会绑定场景中每一个图元(被赋予了这个着色器),而表面着色器则由Material类的实例来表示。它会拥有一个BSDF类对象(可能是BSSDF),用于计算表面上每一点的辐射度(颜色)。

BSDF代表了BRDFs与BTDFs的集合。BSDF构造函数接受一个SurfaceInteraction对象,该对象包含关于表面上任意一点的微分几何信息,以及一个参数eta,该参数给出了边界上的相对折射率。对于不透明的表面,该参数则无效。构造函数将使用着色法线来构造一个正交坐标系。本节中ns表示着色法线(法线贴图上对应坐标的值)和ng代表了几何法线(面法线)。

BSDF存储了最多8个BxDF组件,因为在pbrt中不需要更多组件。BSDF实现了BxDFs坐标系与世界坐标系转换的方法。WorldToLocal(const Vector3f &v)与LocalToWorld(const Vector3f &v)。

PBRT笔记(7)——反射模型

PBRT笔记(7)——反射模型

基础术语

表面反射可以分为4大类:

  1. diffuse 漫反射
  2. glossy specular 镜面反射高光
  3. perfect specular 完美反射高光
  4. retro-reflective distributions 后反射分布
PBRT笔记(6)——采样和重构

PBRT笔记(6)——采样和重构

本文仅作为个人笔记分享,又因为本章涉及多个专业领域而本人皆未接触过,所以难免出错,请各位读者注意。

  1. 对于数字图像需要区分image pixels(特定采样处的函数值)和display pixels(显示器显示值)。
  2. 收集采样值,并将其转化为连续函数的过程被称为重构。
  3. 为了计算在数字图像上的离散像素值,我们需要在原始的图片函数上不断的采样。
  4. 采样与重构的过程中涉及到近似运算,而这个过程中产生的错误被称为锯齿。其产生原因为计算机无法连续对场景进行采样。

可以理解为把真实世界所得图像(人眼)当做一个连续的离散函数,而计算机通过像素显示,为一个不连续的点集。渲染就是一个不断采样,将结果累加缩小误差,并且通过最终值将这个函数重构的过程。(图7.1很好地说明了这些)

PBRT笔记(5)——相机模型

PBRT笔记(5)——相机模型

介绍pbrt中的camera代码大致实现。

PBRT笔记(4)——颜色和辐射度

PBRT笔记(4)——颜色和辐射度

pbrt中颜色与辐射度相关代码介绍。

PBRT笔记(3)——KD树

PBRT笔记(3)——KD树

下文介绍了pbrt中KD树的构建方法。

PBRT笔记(2)——BVH

PBRT笔记(2)——BVH

BVH

构建BVH树分三步:

  1. 计算每个图元的边界信息并且存储在数组中
  2. 使用指定的方法构建树
  3. 优化树,使得树更加紧凑
PBRT笔记(1)——主循环、浮点误差

PBRT笔记(1)——主循环、浮点误差

PBRT2与3之间的改动

  1. 增加了一个功能完备的BRDF模型,支持体积光照与重要性多重路径采样。
  2. 次表面散射,基于光线追踪技术,无需预处理。
  3. 解决浮点数四折五入的问题
  4. 光子映射
  5. 样本生成
  6. 第一章多了讲并行的东西
Raytracing in Weekend、Raytracing Ground个人评价以及学习推荐

Raytracing in Weekend、Raytracing Ground个人评价以及学习推荐

《Ray Tracing in One Weekend》、《Ray Tracing from the Ground Up》的学习建议。

《Ray Tracing in One Weekend》阅读笔记

《Ray Tracing in One Weekend》阅读笔记

此文写于今年5月份,写了一些感觉会对之后读者有帮助的东西,以及一些笔记。因为要参加秦春林的线下交流会,所以看得比较匆忙。有些错误在所难免,还请见谅。
原作者的代码使用的是浮点类型是float,但实际上c++默认的浮点类型是double(IDE里可以设置默认浮点类型),如果直接抄代码渲染结果会不正确。

在Node.js中使用ffi调用dll

在Node.js中使用ffi调用dll

类似的文章还是比较多的,但或多或少有一些问题没有解决,在此我将其整合并分享给大家。

测试环境:

  • Node.js 9.9.0
  • VisualStudio 2015
  • “ffi”: “gavignus/node-ffi#torycl/forceset-fix”,
  • “ref”: “1.3.5”
  • “ref-array”: “1.2.0”
  • “ref-struct”: “1.1.0”
  • “ffi-napi”: “^2.4.3”