BlueRose
文章97
标签28
分类7
在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传统渲染方式的代码迁移指南

前言

4.25的GlobalShader的调用代码发生了一下变化,我在写完RDG例子后顺便写了一下GlobalShader的使用案例。具体的可以参考我的插件:

https://github.com/blueroseslol/BRPlugins

代码位于SimpleGlobalShader.cpp中。

变量使用LAYOUT_FIELD宏进行包裹

对于新定义用于设置变量的GlobalShader基类使用,需要使用DECLARE_INLINE_TYPE_LAYOUT(FYourShaderName,NonVirtual)宏进行声明。另外还有DECLARE_TYPE_LAYOUT(FYourShaderName,NonVirtual)宏,不太清楚差别,但作用应该是一样的。

除此之外还有

class FSimpleGlobalShader : public FGlobalShader
{
    DECLARE_INLINE_TYPE_LAYOUT(FSimpleGlobalShader, NonVirtual);
public:
    static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
    {
        return IsFeatureLevelSupported(Parameters.Platform, ERHIFeatureLevel::SM5);
    }

    static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
    {
        FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
        OutEnvironment.SetDefine(TEXT("TEST_MICRO"), 1);  
    }

    FSimpleGlobalShader(){}

    FSimpleGlobalShader(const ShaderMetaType::CompiledShaderInitializerType& Initializer):FGlobalShader(Initializer)
    {
         SimpleColorVal.Bind(Initializer.ParameterMap, TEXT("SimpleColor")); 
         TextureVal.Bind(Initializer.ParameterMap, TEXT("TextureVal"));
         TextureSampler.Bind(Initializer.ParameterMap, TEXT("TextureSampler"));
    }

    template<typename TRHIShader>
    void SetParameters(FRHICommandList& RHICmdList,TRHIShader* ShaderRHI,const FLinearColor &MyColor, FTexture2DRHIRef InInputTexture)
    {
        SetShaderValue(RHICmdList, ShaderRHI, SimpleColorVal, MyColor); 
        SetTextureParameter(RHICmdList, ShaderRHI, TextureVal, TextureSampler,TStaticSamplerState<SF_Trilinear,AM_Clamp,AM_Clamp,AM_Clamp>::GetRHI(), InInputTexture);
    }

private:
    LAYOUT_FIELD(FShaderResourceParameter, TextureVal);
    LAYOUT_FIELD(FShaderResourceParameter, TextureSampler);
    LAYOUT_FIELD(FShaderParameter, SimpleColorVal);
};

第二个形参视类内是否有虚函数,选择Abstract或者NonVirtual。源代码里基本上都是使用NonVirtual的。

另一个不常用的宏是DECLARE_EXPORTED_TYPE_LAYOUT(FYourShaderName, YOUR_API, Virtual),它用于声明需要被其他类继承的基类。具体的使用方法还请参照UE4源码。

Shader变量需要使用LAYOUT_FIELD宏进行包裹,第一个形参为类型,普通类型声明为FShaderParameter,Texture2d与Sampler声明为FShaderResourceParameter。例如:

LAYOUT_FIELD(FShaderParameter, SimpleColorVal);
LAYOUT_FIELD(FShaderResourceParameter, TextureVal);    
LAYOUT_FIELD(FShaderResourceParameter, TextureSampler);

Shader声明改变

声明宏由DECLARE_SHADER_TYPE(FSimplePixelShader, Global)转变为DECLARE_GLOBAL_SHADER(FSimplePixelShader)。

去除序列化相关函数

去掉virtual bool Serialize(FArchive& Ar) override函数。

LAYOUT_FIELD宏会实现这部分功能。

FImageWriteTask

FImageWriteTask现在接受TArray64的数据。而不是 TArray。如果你想传递TArray数据,可以这么写:

TArray<FColor> OutBMP;
// Fill OutBMP somehow
TUniquePtr<TImagePixelData<FColor>> PixelData = MakeUnique<TImagePixelData<FColor>>(DestSize);
PixelData->Pixels = OutBMP;
ImageTask->PixelData = MoveTemp(PixelData);
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与动画的过度。