zoukankan      html  css  js  c++  java
  • 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
            }
       
        } 
    
    }
  • 相关阅读:
    高质量图形库:pixellib
    有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取
    Freebie: Material Design UI Kit
    Git 10 周年之际,创始人 Linus Torvalds 访谈
    React.js 样式组件:React Style
    有趣 GIF 动图集
    10个免费开源的JS音乐播放器插件
    简约的单页应用引擎:sonnyJS
    2015年4月 非常干货之Python资源大全
    评论 ”[实例] 设计基于JQM的WebApp“
  • 原文地址:https://www.cnblogs.com/sitt/p/4699369.html
Copyright © 2011-2022 走看看