气泡shader_5,Raymarching in UE4(气泡材质)

本文介绍了在UE4中使用Raymarching技术实现气泡材质的详细步骤。首先,通过CustomNode的HLSL计算Raymarching的Alpha和Normal。接着,利用Normal进行Fresnel计算,实现气泡的半透明和高光效果。内容包括Raymarching部分的设置,如最大步进次数、场景深度处理等,以及透明Opacity和颜色的计算,涉及HueShift、Specular和Opacity的调整。最后展示了实现后的效果及蓝图结构。
摘要由CSDN通过智能技术生成

关于raymarching 原理的的部分,这里就不赘述了,这里有一个系列原理的链接,分别介绍了基础原理,采样不同规则体的计算方法,还有变换操作.

直接进入主题,先说下总体的制作方案:

1,用CustomNode的HLSL来实现Raymarching的计算输出是采样的alpha和hit点的normal.

2,利用之前传出的normal进行fresnel计算出半透明,高光.

一,Raymarching部分

新建一个material并设置材质属性如下:只有translucent模式才能获取到深度.

新建CustomNode,这里您可以在code栏中直接输入代码,或者在其中include自己的usf文件,这样就可以在IDE中编写代码,更加方便.这里我用的是后者.可以在code部分键入:

#include "/Engine/1.usf"

return 0;

这样我们就能在usf中愉快的编写了.

usf的存放路径:

在CustomNode的inputs中创建raymarch计算需要的变量.

MaxSteps: 最大步进次数.

WorldPosition:像素的世界空间坐标.

ObjectPosition:材质对象的世界空间坐标.

SceneDepth:场景深度(用于排序的剔除).

CameraPosition:摄像机的世界空间坐标.

Smooth:进行融合操作的的指数

LightDir:灯光的方向

Time:时间

其中的场景深度需要处理一下,SceneDepth是非线性的深度,我们需要把它转成线性深度才能正确的在raymarch用来处理渲染顺序.关于线性深度和非线性深度的区别这里我画了一张图,也就是原始采样的深度采样点之间的距离是一定的,线性的.但是在转移到投影空间之后采样点变得近处比较稀疏远处比较密集了.

刚好线性深度在顶点经过投影变换之后的长度为非线性深度,那么我们可以直接用SceneDepth/(dot(摄像机方向,摄像机朝向)),摄像机方向是指每个像素的摄像机方向矢量,而摄像机朝向只是单纯的表示这个摄像机是怎么放的,如下图.

在output项里我们设置为float4,也就是output.xyz作为normal的输出,output.w作为采样mask的输出.

有了这些元素之后我们可以在usf中进行raymarching计算了.

1,定义最大距离 MaxDist.摄像机的位置ro,摄像机的方向,初始化颜色col.(最后我们就是return这个col,也就是col.xyz为normal输出,col.w为alpha输出).

2,创建所有函数的结构体RMfunction(在usf文件中我们没办法直接定义函数来调用,我们需要把所有的函数都封装在一个结构体RM里,然后在主循环中调用实例化后RM里的函数.)

struct RMfunction{};

3,创建气泡球的距离方程 RMSphere().

4,创建采样的操作smin(),也就对两个球的融合,想了解这个方程的可以直接上IQ大佬的主页查看.

5,创建GetDist(),调用3中的RMsphere().在这里我们可以重复调用它来创建多个球,然后调用smin()融合它们的距离方程,通过Smooth来控制他们的融合程度,还能用time,frac,cos,sin来偏移hit点p,来做气泡徐徐升起的动画.

6,创建RayMarching主循环,调用之前的距离方程GetDist(),唯一和之前教程不同的是我们需要在每一次步进之前检查下该点有没场景内的对象.

if(SceneDepth < length(p- CameraPosition)) break;也就是当该点的深度比场景深度还深的话直接跳出循环剔除这个像素点.

7,创建normal的计算方法GetNormal().关于计算的原理文章开头给的链接也有提及.

8,实例化RM,并且按照顺序调用里头的函数.输出结果 return col;

二,计算透明Opacity和颜色

1,ColorAnimation:如果给RayMarching上贴图的话会比较麻烦,normal本身的颜色就比较像气泡的颜色,可以用HueShift和Time让它更生动一点.

2,Specular:计算高光.

3,Opacity:先用fresnel来让气泡中心透明,然后把计算的好的specular也add进去.

所有的蓝图如下图:

最终效果如下:

小众交流群:672571935

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你想制作一个在Unity中用于展示气泡效果的Shader,可以参考以下步骤: 1. 创建一个Unlit Shader:在Unity中创建一个新的Shader,选择Unlit作为Shader的类型。 2. 添加一个圆形边缘:使用Shader中的片段着色器,添加一个圆形的边缘效果。你可以通过使用一个Sin函数和一个Time变量来实现这个效果。 3. 添加一个噪声纹理:使用一个噪声纹理来模拟气泡的表面纹理,这可以通过使用Perlin Noise等算法来实现。可以通过调整噪声的细节和强度来控制效果的外观。 4. 添加透明度:将气泡的透明度与表面法线的深度相关联,这可以通过计算表面法线和视线之间的角度来实现。 5. 调整材质属性:最后,使用Unity材质属性来控制气泡的颜色、透明度和噪声纹理的细节等。 以上是一个简单的气泡Shader的制作步骤,你可以根据自己的需求和技术水平进行更加复杂的调整和改进。 ### 回答2: Unity中的气泡Shader是一种用于渲染气泡或类似效果的渲染器。该Shader利用了Unity引擎的渲染管线,通过对顶点和片元进行处理,实现了气泡表面的扭曲效果和光照效果。 气泡Shader的实现主要包括两个关键步骤:扭曲效果和光照效果。首先,通过对顶点的位移和法线的变换,创建了气泡表面模糊和扭曲的效果。这种扭曲可以通过利用噪音贴图或数学函数来产生。其次,通过计算光照模型,实现了气泡表面的反射和折射效果。通常可以使用菲涅尔反射率和折射率来模拟光照效果。 气泡Shader的使用可以应用于各种游戏和图形效果中。例如,在海洋场景中,使用气泡Shader可以模拟出海浪上的气泡效果。在虚拟现实中,使用气泡Shader可以增强场景的真实感,并使气泡能够正确地反射和折射周围的光线。此外,气泡Shader还可以用于创建其他特殊效果,比如泡沫和水珠等。 在Unity中使用气泡Shader相对较简单。可以通过创建一个新的Shader并在其中编写扭曲和光照的逻辑。然后将该Shader应用于场景中的具有气泡效果的物体上。为了获得更好的效果,还可以通过调整Shader的属性和参数来控制气泡的大小、扭曲程度和光照效果等。 总结起来,Unity中的气泡Shader是一种用于实现气泡表面的扭曲和光照效果的渲染器。它可以应用于各种场景和特效中,为游戏和图形效果增加视觉上的真实感和趣味性。 ### 回答3: Unity中的气泡Shader是一种用来创建逼真的气泡效果的图形渲染技术。它通过对气泡进行形状、透明度、反射和折射等参数的模拟来实现。 在气泡Shader中,首先要考虑的是气泡的形状。通常,气泡在顶部较宽且渐变变窄,因此可以使用一种特殊的顶点变换来实现这种形状,例如使用一个带有Sin函数的顶点偏移。 其次,需要考虑气泡的透明度。通过使用透明度贴图或者根据气泡表面法线和摄像机方向的夹角来动态计算透明度,可以使气泡在顶部更加透明且向底部逐渐变得不透明。 另外,气泡球面上的反射和折射效果对于增强真实感十分重要。可以使用环境反射贴图和立方体贴图来模拟环境的反射,使气泡看起来更有光泽。同时,可以根据折射理论和气泡表面的法线向量来计算出折射效果,使气泡看起来像是真实的折射介质。 最后,为了增加气泡的动态感,可以使用时间因子来调整气泡表面的波动效果。可以通过使用Sin函数或噪声函数来计算波动的幅度和频率,并将其与时间因子相关联,以便气泡看起来像是不断变化的。 综上所述,Unity中的气泡Shader是通过模拟气泡的形状、透明度、反射和折射等参数来实现逼真的气泡效果的图形渲染技术。通过对气泡形状、透明度、表面反射和折射的处理,以及添加动态波动效果,可以使气泡看起来更加真实和生动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值