Zephus 发表于 2021-12-14 17:37

重走大神之路_ 乐乐姐_推荐阅读_ 卡通化

乐乐姐几乎每个章节都推荐书或资料

一些高大上的英文书,例如:Artistic rendering and cartoon animation
我是不会去看的
原因是,她还推荐了:《GNU1~7》
我更是不会去看
这几本书我可以说当年在旧图书馆都看过,都看过第一章,新馆建成并投入多年了,你可以想象这几本书是有多老(老是有人借,并不很封尘),首先是这些书太旧了,然后就是工作中根本不会用到,当然大神推荐,我也不好说什么,之前浅墨,毛星云也推荐,所以理论上,应该确实是好书,不信邪的可以去看看。
如果让我推荐C#书,我是不会向我以前的上司那样去推荐《。Net红宝书》的,初高级2册,因为这个红宝书C++也出,数据库也出,你怎么能保证他们写的质量一致,又各有特色各自出彩呢,《GNU1~7》可是出了7册啊,估计还能出11~12册,而每本书几百页,含有无数个毫无相关的论文,事实是就是真的不如做中学(前提是你有很多的理论基础,大量的编程工作,就在质变到量变的前一刻),在做中学突破自己是最好的方法,也也和入门与否没有关系,就算你刚入门,看红宝书也不会让你比较入门,工作中也不会用到。当然做中学,有个很大的不好,会很多人懂得写两个语法就以为自己掌握了全宇宙
我还是觉得,能练僻邪剑法的,还会去耍青城大众脸剑法么、???
乐乐姐的推荐,其实就剩下插件了:Toony Cartoon Shader
这个就比较对我的胃口,但还是因人而异吧,哪个方向适合自己就坚持走下去吧,保持前行才是到达目的地的唯一方法
卡通化渲染就两个东西(大家都这么说)

描边 - Outline
渐变色彩 - Ramp
关于描边有太多描述和作品了,也有很多人觉得很简单,特别是那些大厂的主城




瞬间觉得,国外的月亮就是特别圆
其实原理是一样的,这个插件有很多个Shader,可关键就一个,而且很多实现真的很LOW
再多说一点吧,很多国外的东西都很好,规范的东西也值得学习,但是:
1.不符合国情,国内一个部位对一个Shader的做法反而更直接,更好
2.英文,我估计,90后00后反而不重视英文了,不懂
3.过时,国内0.5天都嫌花费时间多,这个插件还是7年前的
4.攀比,非得我的比你强,比你快,比你好,还比你钱多,世上真有这样的好事??
5.多余,右下声明说模型官方的,左下告诉你可以用鼠标,左边是旋转等控制,右边是各项细节控制,核心就一个
6.Surface Shader,在国内这么多年都没流行开来
7.范围太广,很难掌握,国内涉及的范围和技术目前太深太广了,老板太傻,大厂太多,现在对于那些还吐槽国内游戏的,或者问为什么的,我都懒得回怼(3A公司在国内还没出现,但只是果而已,或者也永远不会出现,但这不会阻止我们在一堆小白老板和各种质疑声中去创造因,种最好的因,其他管他呢)
shader扩展的关键

这个Cartoon 插件的关键只有一个:
UsePass "Hidden/ToonyColors-Outline/OUTLINE"

[*]这个方法需要写在Pass{} 外,否则会提示“psss token_USEPass XXXX”,大概意思就是不输入Pass内的语法
[*]外部調用的Pass需要用 Pass { Name 聲明
模拟写了个简单的:
OutLine:

Shader "ORGEDashu/SimpleTexture"
{
    Properties
    {
      _MainTex ("Texture", 2D) = "white" {}
                _Outline("描边宽度",Float) = 1
                _OutlineColor("描边颜色",Color) = (1,1,1,1)
    }
    SubShader
    {
      Tags { "RenderType"="Opaque" }
      LOD 100

      Pass
      {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
                        }


                        ENDCG

      }
                UsePass "ORGEDashu/Sample/OutlinePro/OUTLINE"
    }
}

Shader "ORGEDashu/Sample/OutlinePro"
{
    Properties
    {
               _MainTex ("Texture", 2D) = "white" {}
                _Outline("描边宽度",Float) = 1
                _OutlineColor("描边颜色",Color) = (1,1,1,1)
    }
    SubShader
    {
      Tags { "RenderType"="Opaque" }
      LOD 100

                //Outline default
                Pass
                {
                        Name "OUTLINE"
                        Cull Front
                        Lighting Off
//                        ZWrite Off
                        Tags { "LightMode" = "ForwardBase" }
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag

                        #include "UnityCG.cginc"
                        #define SMOOTH_Z_ARTEFACTS
                        #define OUTLINE_CONST_SIZE
                        struct a2v
                        {
                                float4 vertex : POSITION;
                                float3 normal : NORMAL;
                        };

                        struct v2f
                        {
                                float4 pos : POSITION;
                        };

                        float _Outline;
                        //sampler2D _MainTex;
                        fixed4 _OutlineColor;
                        //float4 _MainTex_ST;

                        v2f vert(a2v v)
                        {
                                v2f o;
                                _Outline *= 0.1f;//乘以0.1 在属性面板拖动容易点
                        #ifdef SMOOTH_Z_ARTEFACTS
                                //Correct Z artefacts
                                float4 pos = mul(UNITY_MATRIX_MV, v.vertex);
                                float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
                                normal.z = -0.6;

                                //Camera-independent size
                                #ifdef OUTLINE_CONST_SIZE
                                //想要搞清楚这个公式 应该要搞清楚物件-》镜头的转换
                                        float dist = distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, v.vertex));
                                        pos = pos + float4(normalize(normal),0) * _Outline * dist * 1.0;
                                #else
                                        pos = pos + float4(normalize(normal),0) * _Outline;
                                #endif

                        #else
                                #ifdef OUTLINE_CONST_SIZE
                                        float dist = distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, v.vertex));
                                        float4 pos = mul(UNITY_MATRIX_MV, v.vertex + float4(v.normal,0) * _Outline * dist * 1.0);
                                #else
                                        float4 pos = mul(UNITY_MATRIX_MV, v.vertex + float4(v.normal,0) * _Outline );
                                #endif
               
                        #endif
                       
                                o.pos = mul(UNITY_MATRIX_P, pos);
                                return o;
                        }

                        float4 frag(v2f IN) : COLOR
                        {
                                return _OutlineColor;
                        }
                        ENDCG
                        }
}
}OutLine的重点是:

这种Outline实现方法,模型过度圆滑效果比较好,对于棱角就很糟心了,你懂的,国内乱七八糟的环境,还要吐槽别人造成的乱七八糟,难道你不是环境中的一份子么,你有更好的办法吗,乱世出英雄哦

Ramp

有见过颜色渐变的博文,如果是光的渐变,就是黑白渐变了,素材:


。。,有点什么都看不到,截图:


Shader "Unity Shader Book/Chapter 7/RampTexture"
{
        Properties
        {
                _Diffuse("Diffuse", Color) = (1, 1, 1, 1)
                _RampTex("Ramp Tex", 2D) = "white"{}
                _Specular("Specular", Color) = (1, 1, 1, 1)
                _Gloss("Gloss", Range(8, 256)) = 20
        }
        SubShader
        {
                Pass
                {
                        Tags{ "LightMode" = "ForwardBase" }

                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #include "Lighting.cginc"

                        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;
                        };

                        fixed4 _Diffuse;
                        sampler2D _RampTex;
                        float4 _RampTex_ST;
                        fixed4 _Specular;
                        float _Gloss;
                       
                        v2f vert (a2v v)
                        {
                                v2f o;
                                o.pos = UnityObjectToClipPos(v.vertex);
                                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                                o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);

                                return o;
                        }
                       
                        fixed4 frag (v2f i) : SV_Target
                        {
                                fixed3 worldNormal = normalize(i.worldNormal);
                                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                                fixed halfLambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;
                                fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb * _Diffuse.rgb;
                                fixed3 diffuse = _LightColor0.rgb * diffuseColor;

                                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
                                fixed3 halfDir = normalize(worldLightDir + viewDir);
                                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss);

                                return fixed4(ambient + diffuse + specular, 1);
                        }
                        ENDCG
                }
        }

        Fallback "Diffuse"
}Ramp重点是:

Color和光照傻傻分不清,反而更复杂
见过纯 Ramp Color,网上文章也很多
关键是多读书,多和美术沟通
EyeLashes

这个卡通渲染插件中,还发现,无论你怎么调整,都没什么作用滴,感受一下


EyeLashes重点是:

*实现很“简单”,就是Transparent, Diffuse,
*但是,我们这种理工狗是不可能分清楚5号和7号口红的区别,还是放弃吧
*远看是没什么卵用的
*还必须,通过uv或者ShinMeshRender 配合
页: [1]
查看完整版本: 重走大神之路_ 乐乐姐_推荐阅读_ 卡通化