Unity体积光实现

本文详细介绍了在Unity中通过后处理径向模糊技术实现体积光的详细步骤,包括提取光源、径向模糊处理以及与源图像叠加。通过C#和ShaderLab代码示例,展示了如何控制光照方向和调整光的强度。
摘要由CSDN通过智能技术生成

在这里插入图片描述

目录

体积光的项目分享:

https://github.com/Claymoreno1/volumelight
https://github.com/Claymoreno1/GodRay

体积光的实现方法有很多种,这里列出三种常用的,此篇博客详细讲解了通过后处理径向模糊方式的体积光实现,另一篇RayMarching体积光讲解了另一种更真实效果更好的方法,其它方式提供了方法和详细链接。

  1. 最简单,手游比较常见的是特效贴片
    2.1
    我们看见的光束其实就是下面这张图片,通过粒子效果很简单就能够实现
    2.2
  2. ShadowGun中经典的GodRays,Blinking GodRays和Blinking GodRays Billboarded,根据远近控制淡入淡出,稍微复杂一点的增加了闪烁和广告牌,如果想学习可以看女神的ShadowGun系列之二——雾和体积光
    1
  3. 屏幕后处理方式(消耗高,也更真实,也是本篇博客的重点内容)
    第一步:提取光源部分
    这一部分比较简单,我们主要从深度和颜色两个方面做阈值,来得到体积光光源
    因为体积光的光源一般在距离比较远或者高的地方,必须防止把人物或者其他拥有强颜色的物体错当成光源。(当然,有时候我们也不想让远处的物体发光,把step翻过来用就行了)
    片段着色器代码如下,本文会在最后提供后处理体积光的全部C#与ShaderLab代码
float4 frag(v2f i):SV_Target{
   
		float4 col=tex2D(_MainTex,i.uv);
		float linearDepth=LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,i.uv));
		col*=step(_StepColor.r+_StepColor.g,col.r+col.g)*step(_Depthfloor,linearDepth);
		return col;			
}

第一个pass结果:
3.1.13.1.2
第二步:径向模糊
径向模糊和高斯模糊的区别就在于一个是照着一条线采样求均值,另一个是在像素周围采样利用权值计算均值。

  • 方法1
    首先得到一条从当前像素到模糊中心的向量
float2 center=_LightPos.xy;
float2 uv=i.uv-center;

当前点的像素颜色值,来自于从沿着这条向量采样的颜色均值

for(float j=0;j<_Level;j++){
   
	col+=tex2D(_MainTex,uv*(1-0.01*j)+center);
}
col/=_Level;
  • 方法2
    其实大体原理和方法1一样,因为径向模糊定义就是如此,不同之处在于添加了采样步长控制向量,添加了一些setp来控制模糊方向
float2 blur=_LightDir.xy*(_LightPos.xy-i.uv);//*step(0,_LightPos.y-i.uv.y);
for(float j=0;j<_Level;j++){
   
	col+=tex2D(_MainTex,i.uv);
	i.uv+=blur;
}
col/=_Level;

3_3
这个效果需要在OnRenderImage函数中对采样步长修改,反复Blit几次
blurtype为ture,方法2

if (blurtype)
{
   
   for (int i = 0; i < LightIntencity; i++)
   {
   
     LightDirx_2 = LightDirx * (i * 2 + 2);
     LightDiry_2 = LightDiry * (i * 
要在Unity实现追,可以使用UnityShader Graph工具来创建自定义着色器,从而实现线跟踪效果。以下是一个简单的步骤指南: 1. 创建一个空的项目,并导入所需的资源。 2. 在Assets窗口中右键单击并选择Create->Shader->PBR Graph,创建一个新的PBR着色器图。 3. 在着色器图中添加一个Custom Function节点,并将其设置为Surface Output的输入。 4. 在Custom Function节点中,使用HLSL编写追代码。例如,您可以使用以下代码来跟踪从相机位置到像素位置的线: ``` float3 rayDirection = normalize(IN.worldPos - _WorldSpaceCameraPos); ``` 5. 将追代码输出到Surface节点的Albedo输入。 6. 调整追代码的参数以获得所需的效果。例如,您可以使用更高的最大反弹数来增加线跟踪质量,或者使用更低的最大反弹数来提高性能。 7. 将新着色器应用于场景中的物体。 对于实现体积,您可以使用Unity的Volumetric Lighting组件。该组件允许您将线跟踪效果与体积合并,从而创建具有更真实外观的场景。以下是一个简单的步骤指南: 1. 在Assets窗口中右键单击并选择Create->Light->Volumetric Light,创建一个新的体积对象。 2. 将体积对象放置在场景中,并调整其大小和位置以适应所需的效果。 3. 在体积对象的属性面板中,启用Volumetric Fog选项,并选择所需的材质。 4. 如果需要,您可以通过调整体积的密度和噪声来进一步自定义外观。 5. 将适当的灯添加到场景中,并将其设置为影响体积。 6. 在相机对象的属性面板中启用HDR选项,以确保体积效果正确呈现。 7. 调整场景中的灯和相机位置,以获得所需的效果。 注意:实现追和体积都需要高性能计算和显卡支持,因此在较低端的计算机上可能会出现性能问题。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值