Unity的Shader如何控制投影颜色
细节慢慢补充,有几个需要注意的地方,必须要有接收投影的pass也就是Name是ShadowCollector的,必须添加#pragma multi_compile_fwdbase,物体的着色器必须有Tag 里面的 {"LightMode" = "ForwardBase"}。处理投影要在接收投影的物体shader里。
随后是三个宏。
SHADOW_COORDS这个宏后面的参数是指第几个通道,不要和其他的出现冲突,也就是要改变投影的颜色话必须要占用一个通道。
在顶点处理器里调用TRANSFER_SHADOW。
然后像素着色器调用SHADOW_ATTENUATION,返回的就是这个像素是否存在阴影中。
可改变投影颜色的范例如下。
Shader "Example/ShadowColor"
{
Properties
{
_MainColor("MainColor",color) = (0.5,0.5,0.5,)
_ShadowColor("ShadowColor",color) = (,,,)
}
SubShader
{
Tags {"RenderType"="Opaque"}
Pass
{
Tags {"LightMode" = "ForwardBase"} CGPROGRAM
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc" #pragma vertex vertexMain
#pragma fragment fragmentMain fixed4 _MainColor;
fixed4 _ShadowColor; struct VertexToFragment
{
float4 pos : SV_POSITION;
half4 uv : TEXCOORD0;
SHADOW_COORDS()
}; VertexToFragment vertexMain (appdata_full v)
{
VertexToFragment result = (VertexToFragment);
result.pos = mul(UNITY_MATRIX_MVP, v.vertex);
result.uv.xy = v.texcoord.xy;
TRANSFER_SHADOW(result)
return result;
} fixed4 fragmentMain (VertexToFragment i) : COLOR0
{
float attenuation = SHADOW_ATTENUATION(i);
return lerp(_MainColor*_ShadowColor,_MainColor,attenuation);
} ENDCG
} Pass
{
Name "ShadowCollector"
Tags { "LightMode" = "ShadowCollector" } Fog {Mode Off}
ZWrite On ZTest LEqual CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_shadowcollector #define SHADOW_COLLECTOR_PASS
#include "UnityCG.cginc" struct appdata { float4 vertex : POSITION;};
struct v2f { V2F_SHADOW_COLLECTOR;}; v2f vert (appdata v)
{
v2f o;
TRANSFER_SHADOW_COLLECTOR(o)
return o;
} fixed4 frag (v2f i) : SV_Target { SHADOW_COLLECTOR_FRAGMENT(i)}
ENDCG
} } }
Unity的Shader如何控制投影颜色的更多相关文章
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨) ...
- Unity中使用摇杆控制
Unity中使用摇杆控制 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50 ...
- unity shader 剔除指定的颜色
Shader "MyShader/PaintingBGTransparency" { Properties{ _MainTex("Base (RGB)", 2D ...
- Unity Shader-后处理:简单的颜色调整(亮度,饱和度,对比度)
好久没坚持写blog了,是时候开始撸一波新博文了!学习Unity有一段时间了,关于Shader的书也看了几本<Unity Shader入门精要>,<Unity 3D ShaderLa ...
- 关于Unity中Shader的使用
在游戏的开发过程中,程序员不太会自己去写shader,因为写起来很麻烦,而且只有Unity会报错,编译器也没有什么提示. 通常是拿别人的shader改一改,当然,程序员还是要能看懂和会一点shader ...
- 关于Unity中Shader的基础认识
Shader也叫着色器,是Unity里面比较难的一个点,网上有很多别人写好的shader,我们可以下载下来用或者修改学习. Shader可以做出很多非常不错的效果,因为它是插在渲染管道里面的程序,一来 ...
- unity surface shader 1
Unity ShaderLib : CGPROGRAM ENDCG之间是CG代码,之外的代码功能都由ShaderLib提供,CG中的一些方法比如tex2D(...)也是ShaderLib对CG进行 ...
- 关于Unity中Shader的内置值
Unity provides a handful of builtin values for your shaders: things like current object's transforma ...
随机推荐
- python之列表【list】
这里介绍下列表的功能 #切片:列表[a:b],从下标为a开始,到下标为(b-1)的元素 # name = [0,1,2,3,4,5,6,7,8,9] # print(name[1:6]) # # 结果 ...
- 设置网站默认用IE7打开
head中加入以下内容 <meta http-equiv="X-UA-Compatible" content="IE=7" />
- 8-组成n的1的个数
/* ones时间限制:1000 ms | 内存限制:65535 KB难度:3 描述 Given a ...
- 把html标签转换为实体 dhtmlspecialchars
把html标签转换为实体/*可以处理数组中的代码,他们的作用是可以把一个数组或字符串中的字符转化为html实体,可以防止页面的跨站问题,那么我们看到他的转换就是将'&','"','& ...
- 彻底测试全部拷贝list相关操作的区别python
1.用浅拷贝后修改数字,可以起到与原数据分离的效果 import copy origin = [, , [, ]] #origin 里边有三个元素:, ,[, ] cop1=origin.copy() ...
- 20155235 2016-2017-2 《Java程序设计》第7周学习总结
20155235 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 认识Lambda语法 Lambda语法概览 Lambda表达式与函数 ...
- Kubernetes web界面kubernetes-dashboard安装
本文讲述的是如何部署K8s的web UI,前提是已经有一个k8s集群后,按照如下步骤进行即可.(如下步骤都是在master节点上进行操作) 1.下载kubernetes-dashboard.yaml文 ...
- 2018.09.30 bzoj2741: 【FOTILE模拟赛】L(分块+可持久化01trie)
传送门 数据结构经典题. 首先考虑另外一种询问方式. 已知权值val,在区间[1,n][1,n][1,n]中找一个数使得valvalval^a[i]a[i]a[i]最大. 这个可以直接01trie. ...
- 2018.09.28 牛客网contest/197/A因子(唯一分解定理)
传送门 比赛的时候由于变量名打错了调了很久啊. 这道题显然是唯一分解定理的应用. 我们令P=a1p1∗a2p2∗...∗akpkP=a_1^{p_1}*a_2^{p_2}*...*a_k^{p_k}P ...
- Shell 中expr的使用
1.expr命令一般用于整数值,其一般格式为:expr argument operator argument一般的用法是使用expr做算术运算,如:[root@centos ~]# expr 10 + ...