在UnrealEngine中用Custom节点实现高斯模糊
3x3高斯模糊
//input sW 分辨率宽
//input sH 分辨率高
//input NotUse 为了开启SceneTextureLookup函数而连接的节点,但是不参与逻辑
//input UV 屏幕缓存的坐标
//14是原始颜色
int tIndex=14;
float4 x1y1=0.0625*SceneTextureLookup(UV+float2(-1.0f/sW,-1.0/sH),tIndex,false);
float4 x2y1=0.125*SceneTextureLookup(UV+float2(0.0f,-1.0/sH),tIndex,false);
float4 x3y1=0.0625*SceneTextureLookup(UV+float2(1.0f/sW,-1.0/sH),tIndex,false);
float4 x1y2=0.125*SceneTextureLookup(UV+float2(-1.0f/sW,0.0f),tIndex,false);
float4 x2y2=0.25*SceneTextureLookup(UV+float2(0.0f,0.0f),tIndex,false);
float4 x3y2=0.125*SceneTextureLookup(UV+float2(1.0f/sW,0.0f),tIndex,false);
float4 x1y3=0.0625*SceneTextureLookup(UV+float2(-1.0f/sW,1.0/sH),tIndex,false);
float4 x2y3=0.125*SceneTextureLookup(UV+float2(0.0f,1.0/sH),tIndex,false);
float4 x3y3=0.0625*SceneTextureLookup(UV+float2(1.0f/sW,1.0/sH),tIndex,false);
return x1y1+x2y1+x3y1+x1y2+x2y2+x3y2+x1y3+x2y3+x3y3;
3X3均值模糊
//input sW 分辨率宽
//input sH 分辨率高
//input NotUse 为了开启SceneTextureLookup函数而连接的节点,但是不参与逻辑
//input UV 屏幕缓存的坐标
//14是原始颜色
int tIndex=14;
float4 x1y1=SceneTextureLookup(UV+float2(-1.0f/sW,-1.0/sH),tIndex,false);
float4 x2y1=SceneTextureLookup(UV+float2(0.0f,-1.0/sH),tIndex,false);
float4 x3y1=SceneTextureLookup(UV+float2(1.0f/sW,-1.0/sH),tIndex,false);
float4 x1y2=SceneTextureLookup(UV+float2(-1.0f/sW,0.0f),tIndex,false);
float4 x2y2=SceneTextureLookup(UV+float2(0.0f,0.0f),tIndex,false);
float4 x3y2=SceneTextureLookup(UV+float2(1.0f/sW,0.0f),tIndex,false);
float4 x1y3=SceneTextureLookup(UV+float2(-1.0f/sW,1.0/sH),tIndex,false);
float4 x2y3=SceneTextureLookup(UV+float2(0.0f,1.0/sH),tIndex,false);
float4 x3y3=SceneTextureLookup(UV+float2(1.0f/sW,1.0/sH),tIndex,false);
return (x1y1+x2y1+x3y1+x1y2+x2y2+x3y2+x1y3+x2y3+x3y3)/9;
看了官方论坛的帖子,法线Custom里面可以写for循环,于是……
//5x5高斯模糊
//input sW 分辨率宽
//input sH 分辨率高
//input NotUse 为了开启SceneTextureLookup函数而连接的节点,但是不参与逻辑
//input UV 屏幕缓存的坐标
//14是原始颜色
int tIndex=14;
int UVOfferset[]={-2,-1,0,1,2};
float Weights[]=
{
0.0036,0.0146,0.0256,0.0146,0.0036,
0.0146,0.0586,0.0952,0.0586,0.0146,
0.0256,0.0952,0.1501,0.0952,0.0256,
0.0146,0.0586,0.0952,0.0586,0.0146,
0.0036,0.0146,0.0256,0.0146,0.0036
};
float3 OutColor={0.0,0.0,0.0};
for(int i=0;i<=4;i++)
{
for(int j=0;j<=4;j++)
{
OutColor+=Weights[i*5+j]*SceneTextureLookup(UV+float2(UVOfferset[j]/sW,UVOfferset[i]/sH),tIndex,false).xyz;
}
}
return float4(OutColor,1.0f);
参考了一下网上的文章写了个可以动态调整的高斯模糊
//动态高斯模糊
//input sW 分辨率宽
//input sH 分辨率高
//input NotUse 为了开启SceneTextureLookup函数而连接的节点,但是不参与逻辑
//input Radius 模糊半径
//input UV 屏幕缓存的坐标
//14是原始颜色
int tIndex=14;
if(Radius<1.0)
return SceneTextureLookup(UV,tIndex,false);
float3 OutColor={0.0,0.0,0.0};
Radius=floor(Radius);
float Sigma=Radius/3;
float Sigma2=2*Sigma*Sigma;
int Number=Radius;
float WeightsSum;
for(int i=-Number;i<=Number;i++)
{
for(int j=-Number;j<=Number;j++)
{
float Weights=(1/(Sigma2*3.1415))*exp(-(j*j+i*i)/Sigma2);
WeightsSum+=Weights;
OutColor+=Weights*SceneTextureLookup(UV+float2(j/sW,i/sH),tIndex,false).xyz;
}
}
OutColor/=WeightsSum;
return float4(OutColor,1.0f);

群里朋友需要一个模糊贴图的于是又写了个
//5x5高斯模糊
//input UV 贴图UV
//input Texture 传入TextureObject
//input TexSize 图片大小,比如float2(512,512)
int UVOfferset[]={-2,-1,0,1,2};
float Weights[]=
{
0.0036,0.0146,0.0256,0.0146,0.0036,
0.0146,0.0586,0.0952,0.0586,0.0146,
0.0256,0.0952,0.1501,0.0952,0.0256,
0.0146,0.0586,0.0952,0.0586,0.0146,
0.0036,0.0146,0.0256,0.0146,0.0036
};
float3 OutColor={0.0,0.0,0.0};
for(int i=0;i<=4;i++)
{
for(int j=0;j<=4;j++)
{
OutColor+=Weights[i*5+j]*Texture2DSample(Texture, TextureSampler, UV+float2(UVOfferset[j]/TexSize.x,UVOfferset[i]/TexSize.y));
}
}
return float4(OutColor,1.0f);

//7x7均值模糊
//input UV 贴图UV
//input Texture 传入TextureObject
//input TexSize 图片大小,比如float2(512,512)
int UVOfferset[]={-3,-2,-1,0,1,2,3};
float Weights[]=
{
1,1,1,1,1,1,1,
1,1,1,1,1,1,1,
1,1,1,1,1,1,1,
1,1,1,1,1,1,1,
1,1,1,1,1,1,1,
1,1,1,1,1,1,1,
1,1,1,1,1,1,1
};
float3 OutColor={0.0,0.0,0.0};
for(int i=0;i<=6;i++)
{
for(int j=0;j<=6;j++)
{
OutColor+=Weights[i*7+j]*Texture2DSample(Texture, TextureSampler, UV+float2(UVOfferset[j]/TexSize.x,UVOfferset[i]/TexSize.y));
}
}
return float4(OutColor,1.0f)/49;
在UnrealEngine中用Custom节点实现高斯模糊的更多相关文章
- 在UnrealEngine中用Custom节点实现描边效果
在<Real Time Rendering, third edition>一书中,作者把描边算法分成了5种类型.1.基于观察角度与表面法线的轮廓渲染.缺点很明显.2.过程式几何轮廓渲染.即 ...
- 在UnrealEngine中用Custom节点实现毛玻璃的效果
本人在论坛上找到了一篇实现毛玻璃效果的文章:https://forums.unrealengine.com/showthread.php?70143-So-Blurred-glass-material ...
- 在UnrealEngine中用Custom节点实现径向模糊
//input NotUse 为了开启SceneTextureLookup函数而连接的节点,但是不参与逻辑 //input UV 屏幕缓存的坐标坐标 //input Strength 力度 //inp ...
- 在UnrealEngine中用Custom节点实现马赛克效果
参考这位大神的Shaderhttp://blog.csdn.net/noahzuo/article/details/51316015 //input BaseUV 屏幕UV //intput Tili ...
- 有关UnrealEngine材质编辑器中的Custom节点的一些小贴士
PS:本文写于2017.2.1日,使用版本为4.13.第二次更新时间为2017.3.15增加了四.一些材质编辑器中的奇怪的技巧: 一.前言在Unreal中材质编辑器提供了Custom节点,作为HLSL ...
- Rocket - debug - TLDebugModuleInner - Drive Custom Access
https://mp.weixin.qq.com/s/1bIqzDYXM36MIfSsjvvYIw 简单介绍TLDebugModuleInner中的针对Custom的访问. 1. customNode ...
- 剖析Unreal Engine超真实人类的渲染技术Part 2 - 眼球渲染
目录 三.眼球渲染 3.1 眼球的构造及理论 3.1.1 眼球的构造 3.1.2 眼球的渲染理论 3.2 眼球的渲染技术 3.2.1 角膜的半透和光泽反射 3.2.2 瞳孔的次表面散射 3.2.3 瞳 ...
- 遗传算法在JobShop中的应用研究(part 5:解码)
解码操作是整个遗传算法最重要的一步,在这步里面我们利用配置文件中的信息将染色体解码成一个有向无环图. 在介绍解码操作之前我们先来看一下配置文件,在part1绪论中我们已经介绍了一个车间调度问题的基本信 ...
- hbm.xml 详解总结
转自 http://blog.csdn.net/tuke_tuke/article/details/49717991 一.hibernate映射文件的作用: Hibernate映射文件是Hiberna ...
随机推荐
- laravel 多检索条件列表查询
public function indexQuestions(Request $request, ResponseFactoryContract $response, QuestionModel $q ...
- [Gym-102091E] How Many Groups
/* 先将a数组从小到大排序 dp[i][j][k]表示到以第i个数为结尾的,且第i个数改了j次,第i个数改动值为k-1的集合最大值 ans是dp过程中的最大集合大小 状态转移: 首先是到i改动为0次 ...
- 为什么访问json接口出现文件下载
在IE9,10,11下,当服务器端返回数据格式为json,且明确设置Content-Type为”application/json;charset=utf-8“时,会提示文件下载.如图所示: 解决办法是 ...
- RHEL7恢复root密码
RHEL7恢复root密码 首先关闭SELINUX [root@panda ~]# getenforce Disabled 然后重启,按↑↓键,进入如下界面,选择第一项,按下e键进行编辑 在此界面找到 ...
- Java开发环境笔记
在配置环境变量中 设置Java_home: 一是为了方便引用,比如,jdk安装在c:\jdk16.0目录里,则设置java_home为该目录路径,那么以后要使用这个路径的时候,只需输入%java_ho ...
- spring+redis的集成,redis做缓存
1.前言 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.我们都知道,在日常的应用中,数据库瓶颈是最容易出现的 ...
- ubuntu安装php+mysql+apche
步骤一,安装apache2 ? sudo apt-get install apache2 安装完成. 运行如下命令重启下: ? sudo /etc/init.d/apache2 restart 在浏览 ...
- 【CF809D】Hitchhiking in the Baltic States
题意: 给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足t1<t2<...<tlent1<t2<...<tlen.最 ...
- django引入现有数据库 转
django引入现有数据库 Django引入外部数据库还是比较方便的,步骤如下: 1.创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新 ...
- Codeforces 803G Periodic RMQ Problem 线段树
Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...