效果如下:



Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的


但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现光束效果的办法。(不会用到体积光复杂的计算,当然局限性也很大,适合于要求不是很高的场景)

原理:

准备好一个锥体模型,半透明着色,并处理好边缘的虚化。

1.椎体网格,就是光束的样子,用来模拟光束的体积感

2.开始编写shader,简单的输出颜色即可,不需要纹理也不需要计算UV,因为是模拟光,就普通的半透明材质,采用blend SrcAlpha OneMinusSrcAlpha的混合模式。vert和frag代码如下:

v2f vert (appdata v)
{v2f o;o.vertex = UnityObjectToClipPos(v.vertex);return o;
}fixed4 frag (v2f i) : SV_Target
{fixed4 col = _TintColor;return col;
}

基本上已经是最简洁的情况了,大概调个颜色则可以达到下面的效果,右下角就利用模型的穿模从而达到一种感觉光是打在了这个立方体上面一样的感觉。

3.那么问题来了,这个光也太假了点吧,边缘居然可以这么硬,一般看到的光束应该是像这样的感觉才对呢,比如:

所以接下来就要处理灯光的边缘,让他虚化一些。查找边缘,就和模型描边,边缘泛光Rim等思路是差不多的,只要找到边缘,将边缘部分透明度降低一些即可达到虚化边缘的效果。这里就采用法线normal和视线的夹角来识别边缘,椎体侧面的法线是刚好垂直朝向,越往中间走,法线与视线方向的夹角越来越小,dot值越来越大(尴尬的手绘图没有画出3D的感觉,所以中间部分的法线就靠想象了)

Frag中的关键代码:

fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
fixed3 worldNormal = normalize(i.worldNormal);
col.a *= abs(dot(viewDir, worldNormal));

修改后的效果如下:

好很多了有一些朦胧的感觉了。

4.如果这个光束没有投射到物体上,而是这样的,那么尾部的效果有略显尴尬了,就是这里:

因为这里法线的过度和边缘是不一样的,所以需要换个思路来处理。这里采用通过模型坐标来做文章(因为我用的这个模型是这样的,尾部是Z为负的那部分)

所以可以在Z小于一定值的时候,透明度做一个渐变的效果来达到尾部虚化的需求,关键代码:

if (i.modelPosZ < _FadeRange) {col.a = lerp(col.a, 0, saturate(abs(i.modelPosZ - _FadeRange) * _FadeFactor));
}

最终虚化后的效果:

完整代码如下:

Shader "Custom/Light"
{Properties{[HDR]_TintColor("Color", Color) = (1,1,1,1)_FadeRange("range", range(-1,0)) = -0.5_FadeFactor("factor", range(0,10)) = 1}SubShader{Tags {"IgnoreProjector" = "True""Queue" = "Transparent""RenderType" = "Transparent"}Pass{blend SrcAlpha OneMinusSrcAlphaCull OffZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float3 normal:NORMAL;};struct v2f{float4 vertex : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;float modelPosZ : TEXCOORD2;};float4 _TintColor;float _FadeRange;float _FadeFactor;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex);o.modelPosZ = v.vertex.z;return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = _TintColor;//边缘虚化fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 worldNormal = normalize(i.worldNormal);col.a *= abs(dot(viewDir, worldNormal));//底部虚化(这里的坐标相关得参考具体的模型坐标来给一个合适的值)if (i.modelPosZ < _FadeRange) {col.a = lerp(col.a, 0, saturate(abs(i.modelPosZ - _FadeRange) * _FadeFactor));}return col;}ENDCG}}
}

【Unity Shader】聚光灯体积光效果的简单实现相关推荐

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

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

  2. [OpenGL] 体积光效果实现

    reference: Volumetric Light Effects in Killzone: Shadow Fall [1] Interactive Rendering Method for Dis ...

  3. Unity Shader · 科技感矩阵效果

    Unity Shader · 科技感矩阵效果 前言 最近想要做一个次世代卡通渲染(伪),选的是崩崩崩的小八(我最喜欢小八了). 先放几张截图,等全部做完之后再分享用到的一些技术叭. 赶紧做完发B站,等 ...

  4. Unity Shader·屏幕抖音效果

    Unity Shader·屏幕抖音效果 前言 最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下. 视频链接 https://www.bilibili.com/v ...

  5. Unity Shader学习:油画效果

    Unity Shader学习:油画效果 油画效果在学习浅墨大神的文章时看到的比较有趣,但是原文中也没详细的算法介绍如何实现,这里就先直接拿来用吧,UI和屏幕后处理都可以用,算法也看的不是很明白,好像是 ...

  6. unity urp管线扫光效果

    urp管线下实现扫光效果 基本思路,还是根据深度还原世界坐标(以下简称world_pos),根据坐标的xyz判断是否在一些范围内,然后进行基于xyz两个坐标轴进行扫光 这里进行一个扩展,让扫光可以沿着 ...

  7. Unity Shader 实现透明护盾效果

    这是大致的效果图,图片压得有点糊.我参考了本篇博客 Unity shader护盾特效. 这是原博客展示的图片: 本例采用了特殊的模型与贴图,原博客里有视频链接的教程,从模型到贴图. 以下是代码 // ...

  8. Unity Shader 实现卡通渲染效果

    本文参考博客Unity Toon Shader 卡通着色器(一):卡通着色 这是我实现的最后效果 我们先一步一步来 最开始我们实现一个只有漫反射效果的Shader,效果和代码如下 Shader &qu ...

  9. unity Shader模拟ps渐变映射效果

    美术要求程序实现一个类似photo中"渐变映射"的效果. 记录一下用unity完成的shader. 放一张路易斯 那么渐变映射的原理是什么?以下是百度的结果: 在使用时,渐变映射首 ...

最新文章

  1. 《.NET与设计模式》学习(一)
  2. [HDU 1254] 推箱子
  3. 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)...
  4. 仔细想了想支持向量机(Support Vector Mechine)
  5. 对于ARM的启动,系统升级,烧写过程和文件系统等方面的总结分析
  6. Android开发-下载网络图片并显示到本地
  7. pycharm和python在mac里安装_MAC安装python-opencv及在pycharm下的配置
  8. python正则表达式怎么用_Python如何使用正则表达式
  9. 解析Tensorflow官方PTB模型的demo
  10. “北漂青年”马云建言:未来服务业发展有三大关键词
  11. 如何打造程序员专属聊天室?
  12. expr命令的一些用法
  13. PowerDesigner生成java类图
  14. pb调用C++dll问题
  15. 完成一份diy计算机组装方案,DIY新手电脑装机教程:自己组装电脑全过程详细图解教学...
  16. 图文详解win7实现局域网共享文件
  17. Widows 环境下安装 ElasticSearch 并配置 ElasticSearch Head 插件
  18. atitit html5 拼图游戏的解决之道
  19. c语言图书管理系统用什么软件,编写c语言的软件 纯C语言编写图书管理系统.doc...
  20. Windows 源码编译 nginx (加入nginx-http-flv-module)

热门文章

  1. 粉笔公考——方法精讲——资料分析
  2. IT 界惊现文豪!华为领导及阿里 P10 遭吐槽!
  3. AIR780E使用AT连接TCP收发数据
  4. Simulink之S-function函数笔记之一
  5. 苹果VS谷歌,开战了?
  6. hdu 1507 Uncle Tom's Inherited Land*
  7. BDC的执行模式与更新模式
  8. 【学习笔记】传说中的马尔可夫决策过程(MDP)和贝尔曼方程(Bellman Equation)
  9. 论文复现—1—A Simple yet Effective Relation Information Guided Approach for Few-Shot Relation Extraction
  10. python3.6.国家政策文本分析代码