UE5实现PS图层样式投影效果

一、图片投影

1、创建材质函数

MF_PS_Style_Shadow

 定义 function input。

 公开到库(可选) 

 Shadow代码:

/**
PS图层样式投影效果@param {UVs}						texture coordinate@param {Texture}					texture object@param {TextureSize}				纹理大小(x, y)@param {ShadowRGBA}					投影颜色与不透明度@param {ShadowRotate}				投影角度@param {ShadowLength}				投影距离@param {ShadowSize}					投影大小@param {BorderThreshold}			边界UVs阈值(左, 上, 右, 下)
*/
float4 Shadow(float2 UVs, Texture2D Texture, float2 TextureSize, float4 ShadowRGBA, float ShadowRotate, half ShadowLength, half ShadowSize, float4 BorderThreshold=0.001) {const float PI = acos(-1);// 单位像素float2 TexturePixel = 1 / TextureSize;// 角度float Angle = 360 * ShadowRotate;// 弧度float Degrees = Angle / 180 * PI;// 阴影反向方位(单位向量)float2 Direction = TexturePixel * float2(cos(Degrees), sin(Degrees));class Function {Texture2D Texture;SamplerState TextureSampler;float4 ShadowRGBA;float2 Position;float BorderThresholdLeft;float BorderThresholdTop;float BorderThresholdRight;float BorderThresholdBottom;float PI;float2 TexturePixel;// 阴影颜色float3 ShadowColor(float3 Color) {// 如果需要与颜色混合,在此修改返回值,如下式 正片叠底。//	return this.ShadowRGBA.rgb * Color;return this.ShadowRGBA.rgb;}// 混合float3 Blend(float3 base, float3 blend, float alpha) {// 如果使用了混合模式,把 blend 按混合公式计算一次,如下式 正片叠底。//	blend = base * blend;return lerp(base, blend, alpha);}// 纹理采样float4 TextureSample(float2 UVs) {// 如果需要 alpha 通道反向,在此修改。return Texture2DSampleLevel(this.Texture, this.TextureSampler, UVs, 0).xyzw;}float4 GetShadowRGBA(float2 UVs) {// 当前像素点 RGBAfloat4 TextureRGBA = this.TextureSample(UVs);// 阴影反向方位 UVsfloat2 PositionUVs = UVs + this.Position;// 阴影反向方位 UVs 超出了 0 - 1 的范围则不计算if (PositionUVs.x < this.BorderThresholdLeft || PositionUVs.x > this.BorderThresholdRight || PositionUVs.y < this.BorderThresholdTop || PositionUVs.y > this.BorderThresholdBottom) {return TextureRGBA;}// 阴影反向方位像素点RGBAfloat4 PositionRGBA = this.TextureSample(PositionUVs);// 阴影透明度float ShadowOpacity = PositionRGBA.a * this.ShadowRGBA.a;if (ShadowOpacity <= 0) {return TextureRGBA;}// 当前像素点混合后的结果色//	this.ShadowRGBA.rgb 为 base 固有色//	TextureRGBA.rgb 为 blend 固有色//	TextureRGBA.a 为 alphafloat3 ShadowBlendColor = this.Blend(this.ShadowColor(PositionRGBA.rgb) * ShadowOpacity, TextureRGBA.rgb, TextureRGBA.a);// 当前像素点混合后的透明度float ShadowBlendOpacity = ShadowOpacity + TextureRGBA.a - ShadowOpacity * TextureRGBA.a;// 当前像素点混合后的RGBAreturn float4(ShadowBlendColor / ShadowBlendOpacity, ShadowBlendOpacity);}float Calculate1DGaussian(float x) {return exp(-0.5 * pow(this.PI * x, 2));}float4 GetShadowSizeRGBA(float2 UVs, half ShadowSize) {// 当前像素点 RGBAfloat4 TextureRGBA = this.TextureSample(UVs);// 投影大小范围内像素颜色累加float4 RGBASum = float4(0, 0, 0, 0);// 投影大小范围内像素的权重float WeightSum = 0;for (half x = -ShadowSize; x <= ShadowSize; x++) {for (half y = -ShadowSize; y <= ShadowSize; y++) {float Weight = this.Calculate1DGaussian(x / ShadowSize) * this.Calculate1DGaussian(y / ShadowSize);WeightSum += Weight;// 阴影偏移 UVsfloat2 OffsetUVs = UVs + float2(x, y) * this.TexturePixel + this.Position;if (OffsetUVs.x < this.BorderThresholdLeft || OffsetUVs.x > this.BorderThresholdRight || OffsetUVs.y < this.BorderThresholdTop || OffsetUVs.y > this.BorderThresholdBottom) {continue;}// 阴影偏移像素点 RGBAfloat4 OffsetRGBA = this.TextureSample(OffsetUVs);// 阴影透明度float Opacity = this.ShadowRGBA.a * OffsetRGBA.a;if (Opacity <= 0) {continue;}// 阴影结果色float4 RGBA = float4(this.ShadowColor(OffsetRGBA.rgb), Opacity);RGBASum += RGBA * Weight;}}// 模糊后的 RGBAfloat4 BlurRGBA = RGBASum / WeightSum;// 当前像素点混合后的结果色float3 Color = this.Blend(BlurRGBA.rgb * BlurRGBA.a, TextureRGBA.rgb, TextureRGBA.a);// 当前像素点混合后的透明度float Opacity = BlurRGBA.a + TextureRGBA.a - BlurRGBA.a * TextureRGBA.a;// 当前像素点混合后的RGBAreturn float4(Color / Opacity, Opacity);}};		// 注意要加分号// Function func;// func.Texture = Texture;// func.TextureSampler = TextureSampler;// func.ShadowRGBA = ShadowRGBA;// func.Position = ShadowLength * Direction;// func.BorderThresholdLeft = BorderThreshold.x;// func.BorderThresholdTop = BorderThreshold.y;// func.BorderThresholdRight = 1 - BorderThreshold.z;// func.BorderThresholdBottom = 1 - BorderThreshold.w;// func.PI = PI;// func.TexturePixel = TexturePixel;Function func = { Texture, TextureSampler, ShadowRGBA, ShadowLength * Direction, BorderThreshold.x, BorderThreshold.y, 1 - BorderThreshold.z, 1 - BorderThreshold.w, PI, TexturePixel };if (ShadowSize < 1) {return func.GetShadowRGBA(UVs);}return func.GetShadowSizeRGBA(UVs, round(ShadowSize));
}

2、创建材质

M_PS_Style_Shadow

修改 材质域 和 混合模式。

 

 调用之前创建的材质函数。

材质函数调用方式。

 如果之前没有公开到库,则使用 material function call 调用

 

 3、效果预览

二、文字投影

1、添加 Retainer Box

设置尺寸,并指定效果材质。

2、添加 TextBlock

3、设置材质实例参数

由于字体所在画布大小为 300 * 100,这里要设置同步。

 

4、效果预览(需要运行游戏才能看到效果)

ShadowSize 为 0。

 ShadowSize 为 10。

 ShadowSize 为 20。

需要改颜色就修改 ShadowRGBA。 

三、人物角色投影

1、创建渲染目标

 命名 RT_Equipment。

用于 UI 贴图,修改参数,这里大小使用1024。

2、创建 Actor 

命名 BP_Equipment

 

添加 场景捕获组件2D。

 根据需要设置参数。

添加 骨骼网络体组件。

指定模型与动画。

 

调整好位置。

3、放入场景。

 将 BP_Equipment 放入 Level,也可以在运行时动态生成。

4、修改材质

 由于 A 通道需要反向,所以之前的 Shadow 代码做如下改动:

		// 纹理采样float4 TextureSample(float2 UVs) {// 如果需要 alpha 通道反向,在此修改。float4 PixelRGBA = Texture2DSampleLevel(this.Texture, this.TextureSampler, UVs, 0).xyzw;return float4(PixelRGBA.rgb, 1 - PixelRGBA.a);}

5、效果预览

四、使用混合模式

假定使用 正片叠底,代码做如下改动。

		// 阴影颜色float3 ShadowColor(float3 Color) {// 如果需要与颜色混合,在此修改返回值,如下式 正片叠底。return this.ShadowRGBA.rgb * Color;}

也可以换成其他的混合模式,具体算法可以参考文章 《HLSL实现PS混合模式》。

效果预览 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/252585.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

PS如何使用制作图片投影效果

如果仅仅是同样大小的背景(灰色或者黑色),则只要新建一个和比原图大三个像素的文件(比如这里原图片为100100,我就建立一个103103的文件)把图片放在左上角,剩下的部分填充灰色或者黑色。然而这样做出来的效果比较差&#xff0c;一般不采用。 真正的边框往往都有两层渐变&#x…

怎么做扁平化ps图标长投影效果

今天我们就用陌鱼社区“超赞一键制作长投影PS动作下载”快速一键制作扁平化ps图标长投影效果&#xff0c;下面请看演示教程。 01、打开软件&#xff0c;载入动作。 02、新建文档(CtrlN)&#xff0c;如下图设置。 03、用自定义工具&#xff0c;画出形状或者用我们制作好的扁平化…

ps投影怎么做之教程:人像投影和物体长投影制作

内容提要&#xff1a;文章介绍ps阴影效果的制作方法,主要使用图层样式下面的投影命令来添加PS投影效果.对PS感兴趣的朋友可加ps学习交流群&#xff1a;142574315 ps教程中投影效果的添加目的主要是增加图像的真实感。ps阴影效果可以使用“图层样式”下面的“投影”命令来做&…

matlab修改图片部分像素值

最近在做一些图像处理方面的工作&#xff0c;发现使用matlab来对图像进行简单地处理十分容易&#xff0c;为了以后工作的方便&#xff0c;现在记录一下自己的一些工作部分。如果转载请记得加上链接&#xff01; 在这里使用的是批量对图像进行像素值的修改&#xff0c;原图片是…

OpenCV修改图片像素值增加、减少

《OpenCV系列教程》 项目位置&#xff1a;OpenCV-Sample 代码位置&#xff1a;11-ImagePixelsBeChange.py import cv2 import numpy as npimg cv2.imread(./res/mini.jpeg) cv2.imshow(img, img)num np.zeros(img.shape, img.dtype) 150 imgIncrease cv2.add(img, num) im…

js操作像素实现图片编辑

基础概念 众所周知,图片是由一个个像素点组成.每一个像素点包含四个值,决定了渲染出来的状态.这四个值为rgba(red, green, blue, alpha). 前三个值是红绿蓝,值的大小范围从0到255,或者从0%到100%之间. 第四个值alpha,规定了色彩的透明度,它的范围为0到1之间.其中0代表完全透…

批量修改图片像素大小:Python GUI 交互界面实现

批量修改图片像素大小&#xff1a;Python GUI 交互界面实现 1、Python 修改图片像素大小 Python 的 PIL 包可以实现图片的读写、像素大小的设置。 安装 pillow 第三方模块&#xff1a; pip install pillow 设置图片大小的示例代码&#xff1a; from PIL import Imageimg …

如何调整图片分辨率大小(适用于电脑/手机)

随着智能手机快速发展&#xff0c;相机分辨率也从几百万像素升级到上千万&#xff0c;甚至上亿像素&#xff1b;超高像素的图片不仅会占用越来越多的存储空间&#xff0c;还会在上传和分享时耗费不少时间&#xff1b;而且在一些特殊APP或者网站上传图片时&#xff0c;可能对图片…

修改图片像素怎么修改

修改图片像素怎么修改&#xff1f;因为我们对图片尺寸的大小修改有很多需求。比如在运营网店就非常需要的&#xff0c;我们会有非常多的图片需要处理。而不同的网店平台还有不同的图片像素限制&#xff0c;比如某宝宝贝描述的图片尺寸要:宽500*高500像素,图片大小要在120KB以内…

Vue.js官网版教程

前言 这是vue官网案例学习&#xff0c;记录一下 序言 vue.js介绍 Vue.js 渐进式 JavaScript 框架https://learning.dcloud.io/#/?vid0 第1节 安装与部署 https://learning.dcloud.io/#/?vid1 <!-- 开发环境版本&#xff0c;包含了有帮助的命令行警告 --> <scri…

0基础js新手JavaScript学习入门教程

1 下载所需工具 chrome&#xff0c;谷歌开发的一款浏览器。vscode&#xff0c;微软开发的一款写代码的工具。 JavaScript代码需要浏览器来运行&#xff0c;用来控制网页的各种行为。 浏览器地址栏访问的是网页&#xff0c;因此JavaScript需要放到网页里。 2 先创建1个网页 …

简单粗暴的JavaScript学习教程,前端入门的不二之选!

JavaScript 是网景&#xff08;Netscape&#xff09;公司开发的一种基于客户端浏览器、面向&#xff08;基于&#xff09;对象、事件驱动式的网页脚本语言。JavaScript语言的前身叫作Livescript。 JavaScript的特点&#xff1a; 简单、易学、易用&#xff1b;跨平台&#xff…

对于初学者的JavaScript 教程

JavaScript是世界上最流行的轻量级、解释型编译编程语言。它也被称为网页的脚本语言。它以开发网页而闻名&#xff0c;许多非浏览器环境也使用它。JavaScript 可用于客户端开发以及服务器端开发。 JavaScript 可以通过两种方式添加到您的 HTML 文件中&#xff1a; 内部 JS&…

node.js入门教程(一)

1. 初识 Node.js Node.js 是 一个基于 Chrome V8 引擎的 JavaScript 运行环境 。 Node.js 的官网地址&#xff1a; https://nodejs.org/zh-cn/ ① 浏览器 是 JavaScript 的 前端运行环境 。 ② Node.js 是 JavaScript 的 后端运行环境 。 ③ Node.js 中 无法调用 DOM 和…

最通俗易懂的JavaScript入门教程

前言&#xff1a;“成功没有捷径&#xff0c;脚踏实地一步一个脚印&#xff0c;该来的总会来&#xff0c;不好高骛远&#xff0c;不急功近利&#xff0c;付出总会有回报&#xff0c;不管处于哪个阶段&#xff0c;都要一步一个脚印&#xff0c;踏实的走好每一步&#xff01;” 你…

Vue.js入门教程(适合初学者)

Vue.js入门教程 Vue官网网址&#xff1a;Vue.js 中文网 Vue.js Vue.js是渐进式JavaScript 框架&#xff0c;是一套构建用户界面的渐进式框架。也可以说Vue.js 是一个用来构建网页界面的 JavaScript 库。 Vue的常用使用方式有两种&#xff1a; 一、使用<script>标签&am…

尚硅谷JavaScript高级教程(javascript实战进阶)学习笔记

前言 这个是我学习过程中的笔记&#xff0c;分享给大家&#xff0c;希望对大家有用。 学习内容是尚硅谷JavaScript高级教程(javascript实战进阶)&#xff0c;这里是视频链接。 我在前面有两篇对于web前端HTML和CSS的学习笔记&#xff0c;有需要的可以看一下哈。 黑马程序员版…

Threejs入门教程

一、本地搭建Threejs官方文档网站 1.官网地址&#xff1a;https://github.com/mrdoob/three.js 下载压缩包并解压或使用git clone 若github过慢&#xff0c;则使用gitee对应网址&#xff1a;three.js: mrdoob/three.js 同步库 2.目录解析 3.启动方式 在three.js项目根目录下…

Javascript机器学习教程

Javascript机器学习教程 使用 Javascript 和 TensorflowJS 通过动手项目从头开始掌握机器学习 课程英文名&#xff1a;Machine Learning with Javascript 此视频教程共1.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下载地址 课程编号…

CAD梦想画图中删除命令

“删除”命令用于删除在CAD作图过程中的图线和多余的图线。用户既可以先选择对象再执行“删除”&#xff0c;也可以先执行“删除”命令再选择对象。选择“删除”命令后&#xff0c;CAD屏幕上的十字光标将会变成一个拾取框&#xff0c;选择需要删除的对象&#xff0c;按enter键。…