细节慢慢补充,有几个需要注意的地方,必须要有接收投影的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如何控制投影颜色的更多相关文章

  1. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  2. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...

  3. Unity中使用摇杆控制

    Unity中使用摇杆控制 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50 ...

  4. unity shader 剔除指定的颜色

    Shader "MyShader/PaintingBGTransparency" { Properties{ _MainTex("Base (RGB)", 2D ...

  5. Unity Shader-后处理:简单的颜色调整(亮度,饱和度,对比度)

    好久没坚持写blog了,是时候开始撸一波新博文了!学习Unity有一段时间了,关于Shader的书也看了几本<Unity Shader入门精要>,<Unity 3D ShaderLa ...

  6. 关于Unity中Shader的使用

    在游戏的开发过程中,程序员不太会自己去写shader,因为写起来很麻烦,而且只有Unity会报错,编译器也没有什么提示. 通常是拿别人的shader改一改,当然,程序员还是要能看懂和会一点shader ...

  7. 关于Unity中Shader的基础认识

    Shader也叫着色器,是Unity里面比较难的一个点,网上有很多别人写好的shader,我们可以下载下来用或者修改学习. Shader可以做出很多非常不错的效果,因为它是插在渲染管道里面的程序,一来 ...

  8. unity surface shader 1

    Unity ShaderLib :  CGPROGRAM  ENDCG之间是CG代码,之外的代码功能都由ShaderLib提供,CG中的一些方法比如tex2D(...)也是ShaderLib对CG进行 ...

  9. 关于Unity中Shader的内置值

    Unity provides a handful of builtin values for your shaders: things like current object's transforma ...

随机推荐

  1. 删除排序数组中的重复数字 II · Remove Duplicates from Sorted Array II

    重复一次 [抄题]: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. [思维问题]: [ ...

  2. Mac 终端便利工具: 管理工具-Homebrew 和提示工具oh my zsh

    命令行提示工具 第一步: Homebrew - 安装与使用 https://blog.csdn.net/sir_coding/article/details/77509602 Homebrew安装问题 ...

  3. [leetcode]636. Exclusive Time of Functions函数独占时间

    Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...

  4. mysql中GROUP_CONCAT的使用

    现在有三个表,结构如下: cate表 CREATE TABLE `cate` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', ...

  5. spring框架之依赖注入(DI)

    1. IOC和DI的概念 * IOC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!! * DI -- Dependency Injection,依赖注入,在 ...

  6. https://www.w3.org/

    W3C   W3C By Region All Australia Österreich (Austria) België (Belgium) Botswana Brasil (Brazil) 中国 ...

  7. Linux ld命令

    一.简介 http://blog.sina.com.cn/s/blog_a0dc7dcf01014c5s.html 二.选项 http://blog.sina.com.cn/s/blog_a0dc7d ...

  8. Oracle 基础表查询

    --查询所有用户表的数据 SELECT * FROM ALL_TABLES WHERE OWNER='USER_NAME' --如果是用该用户登录使用以下语句: SELECT * FROM USER_ ...

  9. linux c++连接mysql编译问题

  10. Zookeeper 系列(二)安装配制

    Zookeeper 系列(二)安装配制 一.Zookeeper 的搭建方式 Zookeeper 安装方式有三种,单机模式和集群模式以及伪集群模式. 单机模式 :Zookeeper 只运行在一台服务器上 ...