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,1)
        _ShadowColor("ShadowColor",color) = (1,1,0,1)
    }
    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(1)
            };

            VertexToFragment vertexMain (appdata_full v)
            {
                VertexToFragment result = (VertexToFragment)0;
                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
        }

    } 

}
时间: 2024-11-09 02:37:59

Unity的Shader如何控制投影颜色的相关文章

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

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 文章开头,先给自己诚求个游戏研发实习的好去处. 浅墨今年1月.明年上半年有近半年的空暇时间可供实习. 近5年游戏编程经验,能够胜任全职的游戏开发工作.仅仅拿实习生的工资(性价比非常高有

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 一.要干些啥: 很久很久没有写文档了,前段时间做了个个人很喜欢的,自认为比较原创的小特效,所以写个文档纪念下(本人特别喜欢音乐) 思路其实很简单,首先用顶点着色器实现一般的水波特效,然后解析音频数据(我

Unity之Shader学习基础篇《一》

最近在学习Shader,将学习的一些心得和案例以及基础知识罗列了一下.这一篇是unity之Shader的基础篇之基础,更多的是一些概念.该篇将分以下几个部分: 1.什么是Shader? 2.GPU和Cg语言 3.Unity中使用Cg语言如何编写Shader? 1.什么是Shader? 1.1.Shder的概念:Shader即着色器,是一款运行在GPU上的程序,用以对三维物体进行着色处理,光与影的计算,纹理颜色的呈现等,从而将游戏引擎中一个个作为抽象的几何数据存在的模型.场景和特效,以和真实世界类

Unity的shader学习2

下面继续看基于surface的shader代码,基本与Vertex&Fragment shader差不多,只是不能写pass,然后只需要声明surface函数,就能处理所有的事情. 1 Shader "T1/Hero/Diffuse" { 2 Properties { 3 _MainTex ("Base (RGB)", 2D) = "white" {} 4 _Color ("Main Color", Color) =

Unity Geometry Shader实现

unity官方文档关于geometry shader的内容等同于没有,这也是因为unity的开发者基本面向的是移动平台开发,所以这种SM4.0的特性基本都不会被开发者考虑.但是本着与时俱进的精神(虽然现在已经不早了)还是研究一下以备不时之需. 在开始unity geometry shader之前,通过DX10的龙书,简单的了解了一下geometry shader的原理.然后看了一个GS的billboard例子,觉得大同小异. 首先要知道,GS和VS以及FS的区别. 在dx9的渲染管线中,可编程的

比较实用的CSS控制连接颜色效果

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>比较实用的CSS控制连接颜色效果</title><style><!--body { font-family: Tahoma; font-size: 8pt }.leftmenu {width:150px;}.leftm

控制边框颜色:《CSS3 Border-color》

CSS3中有关于Border的属性一共有三个:圆角border-radius,图片边框border-images,边框多颜色border-color,其中圆角border-radius是常用的一个属性,而且现在很多网站制作圆角效果都使用border-radius来实现; 在CSS2中,我们可以把border-color同时应用到不同的边框上,也可以分别在各边上色,如: border-color: <color>/*其中可以上一个值,也可以是多个值,具体我在这里不多说了,大家来时用到的也特别多*

Unity 切换Shader耗CPU大

在游戏中,怪物或者人受到攻击后,会有变白的效果.这个效果是Shader实现的.在判定被攻击的时候切换Shader. Shader shader = getBeAttackShader(); material.shader = shader; static Shader s_BeattackShader = null; protected virtual Shader getBeAttackShader() { if(s_BeattackShader == null) { s_BeattackSh