shader篇-阴影
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篇-阴影相关推荐
- 2d shader unity 阴影_Unity中实现2D光照系统
在一些 2D 游戏中引入实时光影效果能给游戏带来非常大的视觉效果提升,亦或是利用 2D 光影实现视线遮挡机制.例如 Terraria, Starbound. 2D 光影效果需要一个动态光照系统实现, ...
- 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)
来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...
- UI优化策略-Shader篇
原文:https://zhuanlan.zhihu.com/p/33458843 前言 优化本身是一件琐碎且耗神的事情,需要经历问题定位.原因探查.优化方案设计和实现.效果验证.资源修改多个步骤,也会 ...
- 深入URP之Shader篇5: SimpleLit Shader分析(1)
SimpleLit.shader 本篇开始分析simple lit shader.我们通过分析unlit shader了解了URP shader的结构,以及一些基础功能.而simple lit sha ...
- 深入URP之Shader篇8: SimpleLit Shader分析(4)
Simple Lit Forward Pass 本篇继续 Fragment shader 函数 InitializeInputData InputData inputData; InitializeI ...
- 2d shader unity 阴影_UNITY崩坏3角色渲染实践
最近二次元手游,卡通渲染都挺火的.虽然公司没开这类型项目,但是渲染来玩一下也好,原理都是一样,比较简单. 在日式卡通中,<罪恶装备>.<崩坏3>的效果都很不错,都是几年前的产品 ...
- 深入URP之Shader篇3: Unlit Shader分析[下]
Unlit shader 上篇中我们分析了Unlit shader的Properties在ShaderGUI中的处理,接下来看Sub Shader. SubShader unlit shader以及其 ...
- Shader山下(二十七)平面阴影
以下摘录自<Unity 3D ShaderLab开发实战详解>,第10章. 转注:这是一个非常简单且廉价的实时假阴影,比较常用到,据我所知,王者荣耀中就使用了类似的手法.缺点就是比较假,只 ...
- Android绘图Canvas十八般武器之Shader详解及实战篇(下)
前言 上一篇<Android绘图Canvas十八般武器之Shader篇(上)> 我们知道了Bitmap的用法,及TileMode的详细情况.接下来,这一篇作为整个知识体系的下半部要讲的是S ...
- Android中自定义视图View之---前奏篇
前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自 ...
最新文章
- 【视频】视频方面大神博客总结
- MAC EI Capitan上更新系统自带SVN版本号(关闭SIP方能sudo rm)
- 页面按钮埋点+跟踪location.search
- 对称密钥加密算法 对称轮数_选择Java加密算法第2部分–单密钥对称加密
- ffmpeg环境变量设置和安装后不能加载共享库的错误解决
- 基于Carbide.C++ 的Symbian开发环境搭建
- oracle-00028,Oracle 10g錯誤:「ORA-00028:您的會話已被終止」
- YTU 2553: 谁是赢家
- 【原创】Bug管理操作规范个人经验总结
- sql 结果相加_SQL联结语句
- 计算机网络第七版-《软件工程》试题(第4套含答案)
- 机器学习——K均值算法(K-means)
- python 网络设备巡检_Python自动巡检H3C交换机实现过程解析
- import * as用法
- 渥太华大学计算机科学COOP,渥太华大学专业哪个好
- 【华为OD机试真题 python】连续出牌数量【2022 Q4 | 200分】
- WEB前端学习笔记-HTML
- IT人系列一 王珅:程序员转型做旧书书商年交易额逾千万
- 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法
- mysql 密码忘记办法