现实中的体积光效果:



在生活中,我们常会看到类似这样的效果,也就是丁达尔效应。

其他游戏中的使用

例如深海迷航中的使用(P.S. 游戏真的很好玩,续集的零度之下也是非常nice的)

Unity中的简单实现

在用Unity来渲染MMD的时候想加一点科幻的光雾效果,之前做崩坏3童谣渲染时候就用到过,所以最先想到的就是体积光(GodRay)。
先上几张截图吧


可能这一张看的不是很清楚。。。

Shader源码

Shader "Kirk/Shaft"
{Properties{_Shaftcolor("Shaft color", Color) = (1,0.8068966,0,0)_Opacityshift("Opacity shift", Range( 0.01 , 1)) = 1_Frequency("Frequency", Range( 0 , 3)) = 0_FrequencyScale("Frequency Scale", Range( 0 , 0.5)) = 0.5_Emmisionlevel("Emmision level", Range( 0.01 , 50)) = 0.01_Texture2blend("Texture 2 blend", Range( 0 , 1)) = 0.5_Texture3blend("Texture 3 blend", Range( 0 , 1)) = 0.5_Noise_level("Noise_level", Range( 0 , 1)) = 0.15_Texture1tiling("Texture1 tiling", Vector) = (1,1,0,0)_Texture2tiling("Texture2 tiling", Vector) = (1,1,0,0)_Texture3tiling("Texture3 tiling", Vector) = (1,1,0,0)_Texture4tiling("Texture4 tiling", Vector) = (1,1,0,0)_Texture1speed("Texture1 speed", Vector) = (0.08,0,0,0)_Texture2speed("Texture2 speed", Vector) = (0.1,0,0,0)_Texture3speed("Texture3 speed", Vector) = (-0.1,0,0,0)_Texture4speed("Texture4 speed", Vector) = (-0.1,0.1,0,0)_Texture1("Texture1", 2D) = "white" {}_Texture2("Texture2", 2D) = "white" {}_Texture3("Texture3", 2D) = "white" {}_Texture4("Texture4", 2D) = "white" {}[HideInInspector] _texcoord( "", 2D ) = "white" {}[HideInInspector] __dirty( "", Int ) = 1}SubShader{Tags{ "RenderType" = "Transparent"  "Queue" = "Transparent+0" "IgnoreProjector" = "True" "IsEmissive" = "true"  }Cull OffCGINCLUDE#include "UnityShaderVariables.cginc"#include "UnityPBSLighting.cginc"#include "Lighting.cginc"#pragma target 4.6struct Input{float2 uv_texcoord;};uniform sampler2D _Texture1;uniform float2 _Texture1speed;uniform float2 _Texture1tiling;uniform sampler2D _Texture2;uniform float2 _Texture2speed;uniform float2 _Texture2tiling;uniform float _Texture2blend;uniform sampler2D _Texture3;uniform float2 _Texture3speed;uniform float2 _Texture3tiling;uniform float _Texture3blend;uniform sampler2D _Texture4;uniform float2 _Texture4speed;uniform float2 _Texture4tiling;uniform float _Noise_level;uniform float4 _Shaftcolor;uniform float _Emmisionlevel;uniform float _Frequency;uniform float _FrequencyScale;uniform float _Opacityshift;void surf( Input i , inout SurfaceOutputStandard o ){float2 uv_TexCoord32 = i.uv_texcoord * _Texture1tiling + float2( 0,0 );float2 panner35 = ( uv_TexCoord32 + _Time.y * _Texture1speed);float2 uv_TexCoord41 = i.uv_texcoord * _Texture2tiling + float2( 0,0 );float2 panner42 = ( uv_TexCoord41 + _Time.y * _Texture2speed);float4 lerpResult93 = lerp( tex2D( _Texture1, panner35 ) , tex2D( _Texture2, panner42 ) , _Texture2blend);float2 uv_TexCoord46 = i.uv_texcoord * _Texture3tiling + float2( 0,0 );float2 panner48 = ( uv_TexCoord46 + _Time.y * _Texture3speed);float4 lerpResult94 = lerp( lerpResult93 , tex2D( _Texture3, panner48 ) , _Texture3blend);float2 uv_TexCoord112 = i.uv_texcoord * _Texture4tiling + float2( 0,0 );float2 panner114 = ( uv_TexCoord112 + _Time.y * _Texture4speed);float4 lerpResult121 = lerp( float4( 0,0,0,0 ) , tex2D( _Texture4, panner114 ) , lerpResult94.r);float4 lerpResult120 = lerp( lerpResult94 , lerpResult121 , _Noise_level);float4 _textures75 = lerpResult120;float4 blendOpSrc33 = _textures75;float4 blendOpDest33 = _Shaftcolor;float4 _shaft77 = ( saturate( ( blendOpSrc33 * blendOpDest33 ) ));o.Albedo = _shaft77.rgb;float4 _emmision79 = ( _shaft77 * _Emmisionlevel );o.Emission = _emmision79.rgb;float _frequency71 = (sin( ( _Time.y * _Frequency ) )*_FrequencyScale + _FrequencyScale);float4 lerpResult72 = lerp( _textures75 , float4( 0,0,0,0 ) , _frequency71);float4 _opacity84 = ( lerpResult72 * _Opacityshift );o.Alpha = _opacity84.r;}ENDCGCGPROGRAM#pragma surface surf Standard alpha:fade keepalpha fullforwardshadows ENDCGPass{Name "ShadowCaster"Tags{ "LightMode" = "ShadowCaster" }ZWrite OnCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 4.6#pragma multi_compile_shadowcaster#pragma multi_compile UNITY_PASS_SHADOWCASTER#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2#include "HLSLSupport.cginc"#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )#define CAN_SKIP_VPOS#endif#include "UnityCG.cginc"#include "Lighting.cginc"#include "UnityPBSLighting.cginc"sampler3D _DitherMaskLOD;struct v2f{V2F_SHADOW_CASTER;float2 customPack1 : TEXCOORD1;float3 worldPos : TEXCOORD2;UNITY_VERTEX_INPUT_INSTANCE_ID};v2f vert( appdata_full v ){v2f o;UNITY_SETUP_INSTANCE_ID( v );UNITY_INITIALIZE_OUTPUT( v2f, o );UNITY_TRANSFER_INSTANCE_ID( v, o );Input customInputData;float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;fixed3 worldNormal = UnityObjectToWorldNormal( v.normal );o.customPack1.xy = customInputData.uv_texcoord;o.customPack1.xy = v.texcoord;o.worldPos = worldPos;TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )return o;}fixed4 frag( v2f IN#if !defined( CAN_SKIP_VPOS ), UNITY_VPOS_TYPE vpos : VPOS#endif) : SV_Target{UNITY_SETUP_INSTANCE_ID( IN );Input surfIN;UNITY_INITIALIZE_OUTPUT( Input, surfIN );surfIN.uv_texcoord = IN.customPack1.xy;float3 worldPos = IN.worldPos;fixed3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );SurfaceOutputStandard o;UNITY_INITIALIZE_OUTPUT( SurfaceOutputStandard, o )surf( surfIN, o );#if defined( CAN_SKIP_VPOS )float2 vpos = IN.pos;#endifhalf alphaRef = tex3D( _DitherMaskLOD, float3( vpos.xy * 0.25, o.Alpha * 0.9375 ) ).a;clip( alphaRef - 0.01 );SHADOW_CASTER_FRAGMENT( IN )}ENDCG}}Fallback "Diffuse"
}

UnityShader 实现简单的体积光相关推荐

  1. UnityShader实现简单的体积光

    欢迎来到我的博客 又开始疯狂摸鱼了,药丸药丸!!!真是是间歇性踌躇满志,持续性混吃等死啊. 本篇文章用两种比较简单的方法实现了体积光,因为简单,所以瑕疵还是有的. 上图是百度百科的丁达尔效应那弄来的图 ...

  2. Unity3D简单体积光的实现

    实现思路 为了实现一个简单的体积光效果,我们直接把模型背面的顶点按照光照方向挤出一定距离,再按照距离对颜色进行插值,就可以实现简单的体积光效果 代码实现 首先体积光是一个半透明效果,所以关闭深度写入, ...

  3. 【Unity Shader】聚光灯体积光效果的简单实现

    效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...

  4. UnityShader——挺进体积光

    原本是想找找体积雾的,无意中发现了 GPU Gems 3上的一篇屏幕特效实现体积光散射的文章,实现了一波发现文章里公式列的很高大上,结果具体实现却出乎意料的简单,只是通过像素的屏幕位置和光源的屏幕位置 ...

  5. 【UnityShader】光线追踪体积光

    最近尝试实现了一下光线追踪体积光,效果如下: 光线追踪(Ray tracing)是三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型 ...

  6. UnityShader实战 之 体积光的实现

    大家好,我是Zander. 今天我们用Shader来模拟体积光.先看一下效果: 这是在ShadowGun场景里的一个实现效果. Shader代码如下: Shader "Custom/Blin ...

  7. unity3d 求两个点长度_Unity3D实现体积光

    体积光是现实中常见的因丁达尔效应而产生的一种大气现象,文人墨客常用"慵懒的阳光泄下"描绘该现象带来的美感.笔者在一次旅游后见到了这种神奇的自然现象,遂决定在游戏中实现并使用这样的效 ...

  8. webgl径向模糊实现体积光

    体积光介绍 首先,我们要确认一下什么是体积光.体积光通俗来说是我们能看见的"光路",并不是所有灯光都会形成体积光效果,它是光照到大气中粒子散射后得到的效果(丁达尔效应).我们有时候 ...

  9. [图形学] Killzone: Shadow Fall 中的体积光效果

    reference : <GPU Pro 5> 简介 体积光效果是由于光线在潮湿.多尘或烟雾环境中散射产生的(如图3.1所示).这是一个令人惊叹的自然现象,它可以用于创建壮观的图像,并为环 ...

最新文章

  1. Genetic Algorithm遗传算法,两个代码实现例子
  2. 关于querySelector 和 document.getElementsByTagName 选中集合问题
  3. 遇到ORA-3136的解决之道
  4. Win32多线程编程(2) — 线程控制
  5. 基于AE+C#读取文件及图层输出
  6. Asp.net MVC中如何实现依赖注入(DI)(二)
  7. Node.js与V8引擎
  8. 解方程求PH值,POJ(2006)
  9. Jmeter录制脚本时消息体数据乱码
  10. 修改Mac的提醒声音,这样操作才正确! 调节音量提示音怎么更改?
  11. 双绞线连接布线方案(计算机网络)
  12. 小学生计算机兴趣班名字,小学生网名大全
  13. 计算机动画可分为二维和三维动画,二维动画与三维动画设计的区分
  14. 关于时间复杂度的详解
  15. 批量实现json_to_dataset将json文件转换为训练所需的dataset
  16. POI IllegalArgumentException: Sheet index (0) is out of range (no sheets)问题解决
  17. 【IRP】Windows 驱动之IRP
  18. 小程序 订单倒计时系列
  19. linux上namd使用教程,NAMD入门教程(三)[共28页].pdf
  20. Android内存优化之图片查重

热门文章

  1. 安卓开发之模拟智能家电实例(IO写法)
  2. 大学计算机实践access,自考《数据库及其应用》(Access版)实践性环节考核大纲
  3. 紫光同创 FPGA 开发跳坑指南(四)—— DDR3 控制器 IP 的使用
  4. 百问网--七天物联网课程学习笔记(4)
  5. WiFi开关压力测试
  6. 神舟z7m安装Linux,神舟战神Z7M重装win10系统教程
  7. 输入框向上移动HTML5,HTML输入框样式
  8. NuGet 符号服务器
  9. 开源OA:想做好会议管理,利用OA办公系统就可以
  10. 掌握这3种避税要点,企业轻松应对税局检查