shader篇-阴影

标签(空格分隔): shader


  • shader篇-阴影

    • 简介
    • 投射阴影实现
    • 接受阴影
    • Unity统一管理光照衰减和阴影
    • 透明度物体的阴影

简介

阴影的实现需要2个过程:
一、接受阴影的物体,需要在shader中采样阴影映射纹理,并把采样后结果与光照结果相乘获得阴影效果。
二、一个物体如果想投射阴影,就需要将该物体加入光照映射纹理的计算中,以便被采样时可以获取该物体相关信息。Unity Shader中该过程是又LightgMode 为ShadeowCaster的Pass实现。

投射阴影实现

Unity中,是否让物体投射或接受阴影,是由mesh renderer组件的Cast Shadows和Receive Shadows的设置来实现
不过即便没有设置,如果fallback能调用含LightMode 为ShadowCaster的Pass时,一样能投射阴影,比如说 Fallback “Specualr”,通过回调内置的Specular可以间接调用含有LightMode 为ShadowCaster的Pass。

接受阴影

编写接受阴影的shader时需要#include “AutoLight.cginc”,计算阴影的宏都是来自这个文件。
配置

Properties {_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_Gloss ("Gloss", Range(8.0, 256)) = 20
}
SubShader {
Tags { "RenderType"="Opaque" }Pass {Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma multi_compile_fwdbase   #pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;SHADOW_COORDS(2)};

注意:为保证内置宏运行正确,a2v结构体顶点坐标变量名必须
顶点着色器

v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;// 计算阴影值TRANSFER_SHADOW(o);return o;
}

之后,我们使用内置宏SHADOW_ATTENUATION在片元着色器中计算阴影值

Unity统一管理光照衰减和阴影

unity内置了一个宏计算光照衰减和阴影UNITY_LIGHT_ATTENUATION

v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;TRANSFER_SHADOW(o);return o;
}fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 halfDir = normalize(worldLightDir + viewDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);return fixed4((diffuse + specular) * atten, 1.0);
}

这种内置宏可以简化我们某个工作

透明度物体的阴影

对于大多数不透明物体,fallback设为VertexLit就可以得到正确的阴影,但不透明物体就要小心了。

配置

Properties {
_Color ("Color Tint", Color) = (1, 1, 1, 1)
_MainTex ("Main Tex", 2D) = "white" {}
_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
}
SubShader {
Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}Pass {Tags { "LightMode"="ForwardBase" }Cull OffCGPROGRAM#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;fixed _Cutoff;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;float2 uv : TEXCOORD2;SHADOW_COORDS(3)};

注意:SHADOW_COORDS的参数是3,意味着它将占有第四个插值寄存器TEXCOORD3

    FallBack "Transparent/Cutout/VertexLit"
}

还有fallback,这一次不能间接调用Vertexlit了,我们需要直接调用Transparent/Cutout/VertexLit,只有这样才能调用含透明度测试的shader

注意:Unity内置的半透明shader都不会添加阴影,因为半透明物体关闭了深度写入,必须处理好渲染顺序,否则阴影处理会非常复杂

shader篇-阴影相关推荐

  1. 2d shader unity 阴影_Unity中实现2D光照系统

    在一些 2D 游戏中引入实时光影效果能给游戏带来非常大的视觉效果提升,亦或是利用 2D 光影实现视线遮挡机制.例如 Terraria, Starbound. 2D 光影效果需要一个动态光照系统实现, ...

  2. 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)

    来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...

  3. UI优化策略-Shader篇

    原文:https://zhuanlan.zhihu.com/p/33458843 前言 优化本身是一件琐碎且耗神的事情,需要经历问题定位.原因探查.优化方案设计和实现.效果验证.资源修改多个步骤,也会 ...

  4. 深入URP之Shader篇5: SimpleLit Shader分析(1)

    SimpleLit.shader 本篇开始分析simple lit shader.我们通过分析unlit shader了解了URP shader的结构,以及一些基础功能.而simple lit sha ...

  5. 深入URP之Shader篇8: SimpleLit Shader分析(4)

    Simple Lit Forward Pass 本篇继续 Fragment shader 函数 InitializeInputData InputData inputData; InitializeI ...

  6. 2d shader unity 阴影_UNITY崩坏3角色渲染实践

    最近二次元手游,卡通渲染都挺火的.虽然公司没开这类型项目,但是渲染来玩一下也好,原理都是一样,比较简单. 在日式卡通中,<罪恶装备>.<崩坏3>的效果都很不错,都是几年前的产品 ...

  7. 深入URP之Shader篇3: Unlit Shader分析[下]

    Unlit shader 上篇中我们分析了Unlit shader的Properties在ShaderGUI中的处理,接下来看Sub Shader. SubShader unlit shader以及其 ...

  8. Shader山下(二十七)平面阴影

    以下摘录自<Unity 3D ShaderLab开发实战详解>,第10章. 转注:这是一个非常简单且廉价的实时假阴影,比较常用到,据我所知,王者荣耀中就使用了类似的手法.缺点就是比较假,只 ...

  9. Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    前言 上一篇<Android绘图Canvas十八般武器之Shader篇(上)> 我们知道了Bitmap的用法,及TileMode的详细情况.接下来,这一篇作为整个知识体系的下半部要讲的是S ...

  10. Android中自定义视图View之---前奏篇

    前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自 ...

最新文章

  1. 【视频】视频方面大神博客总结
  2. MAC EI Capitan上更新系统自带SVN版本号(关闭SIP方能sudo rm)
  3. 页面按钮埋点+跟踪location.search
  4. 对称密钥加密算法 对称轮数_选择Java加密算法第2部分–单密钥对称加密
  5. ffmpeg环境变量设置和安装后不能加载共享库的错误解决
  6. 基于Carbide.C++ 的Symbian开发环境搭建
  7. oracle-00028,Oracle 10g錯誤:「ORA-00028:您的會話已被終止」
  8. YTU 2553: 谁是赢家
  9. 【原创】Bug管理操作规范个人经验总结
  10. sql 结果相加_SQL联结语句
  11. 计算机网络第七版-《软件工程》试题(第4套含答案)
  12. 机器学习——K均值算法(K-means)
  13. python 网络设备巡检_Python自动巡检H3C交换机实现过程解析
  14. import * as用法
  15. 渥太华大学计算机科学COOP,渥太华大学专业哪个好
  16. 【华为OD机试真题 python】连续出牌数量【2022 Q4 | 200分】
  17. WEB前端学习笔记-HTML
  18. IT人系列一 王珅:程序员转型做旧书书商年交易额逾千万
  19. 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法
  20. mysql 密码忘记办法

热门文章

  1. 写代码实现功能并不重要,重要的是一种独到的思维和架构
  2. 1068 万绿丛中一点红 (20 分)测试点3、5
  3. java+rabbitMQ实现一对一聊天
  4. 找不到驱动程序类,加载驱动失败,连接数据库失败
  5. 自然语言处理 # 中文分词技术 概述
  6. pass parameters to view(参数视图)
  7. 中国计算机学会推荐国际学术会议和期刊目录(2019,最新)
  8. Android人脸支付功能,android支付宝上刷脸支付的人脸识别技术
  9. 基于QT实现西克sick激光LMS系列单线激光数据读取及显示
  10. Java:打包成jar包