ue4 函数和宏区别_UE4的第一个Shader--Lens Distortion

本文详述了UE4中Lens Distortion Shader的实现过程,包括如何创建renderTarget、实现shader算法和使用renderTarget在Material编辑器中实现畸变效果。通过分析DrawUVDisplacementToRenderTarget函数,揭示了在渲染线程中如何通过GlobalShader进行GPU计算,并指出在没有传入顶点位置和uv信息的情况下,通过GlobalVertexId计算得出所需数据。
摘要由CSDN通过智能技术生成

abee74c5c10e9a1f87c96b117ebdc3e5.png

Lens Distortion是UE4自带的一个shader插件,官网文档中就有详细实现步骤,文章的目的就是分析这个插件到底做了什么,以及如何实现自己的GlobalShader。

本文不会过度分析shader中的具体算法,只是讲解实现一个自定义GlobalShader的主要步骤,以及尽可能详细的讲解关键步骤中每一行代码的意义。

UE4官方shader插件​docs.unrealengine.com

首先按照官网文章的要求,一步一步做出来,直到编辑器中运行显示以下内容,代表你已经完成此插件。

697f86e1c22a9c0636ac9269f60dfc18.png

a0e13ca32d7491ae172f9d274fe7dde3.png

下面我们来逐步分析整个过程到底是怎么回事。

1.目的

你肯定有诸多疑惑,这到底显示的是个啥,这个插件该咋用呢?这个shader的目的是什么?从效果上来看,这不就是个小号的不怎么方正的矩形嘛。

其实不难理解,RT_00这张纹理图存储的是uv的偏移信息,RG是修复畸变的uv偏移量,BA是产生畸变的UV偏移量。用法如下:

60018ee9db307ecfcd5f5a25465e868a.png
MAT_RT

d7b0fbfe7839da22c66bc12664100df1.png
左边为畸变后,右边为原图

为什么要减去0.5再乘以2,因为贴图不能存储负数,所以在输出的时候,把负数都增加了偏移,还被缩小了两倍,所以我们使用时要把数值再加回来。

所以这个插件的目的就是输出uv偏移的纹理,实现修正畸变或者产生畸变的效果。

2.过程:

粗略构思不难得出需要做下面3步:

1.创建一个renderTarget用于接收畸变信息

2.实现一个shader算法,使我们的GPU绘制出一张uv偏移图到renderTarget上

3.利用这张图(renderTarget)在Material编辑器中实现畸变效果

最复杂的肯定是第二步,插件中几乎所有的代码都围绕第二步展开。

下面我们来一步步分析插件的代码:

01.这是官方文章末尾的一张图,演示插件的用法,不难看出,它调用了DrawUVDisplacementToRenderTarget函数,此函数接收一堆算法的参数和UTextureRenderTarget2D类型的引用,即我们先前创建的RT_00。

8a23628c9fd980e1f62d4a9fd3a0bbbc.png

打开EnginePluginsCompositingLensDistortionSourceLensDistortionClassesLensDistortionBlueprintLibrary.h,便可看到这个函数具体定义和实现。让我们转到函数实现,如下图所示:

c9e81d36715508cdca80bfefaff33c45.png

注意:让我们暂时忽略其他算法参数,只关注OutputRenderTarget,看看这个OutputRenderTarget到底经历了怎么样的变化,变成了开篇那张图那样

此函数很简单,只是简单调用CameraModel.DrawUVDisplacementToRenderTarget函数,转到DrawUVDisplacementToRenderTarget函数实现,前面都是一些算法参数的定义与计算,我们暂且忽略,直接翻到函数底部,这里才是真正干活的入口:<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值